我有下表:

mysql> DESC my_contacts;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | varchar(20) | NO   | PRI |         |       |
| location | varchar(20) | YES  |     | NULL    |       |
| city     | varchar(20) | YES  |     | NULL    |       |
| state    | varchar(2)  | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
4 rows in set (0.01 sec)

如果我选择所有我得到:
mysql> SELECT * FROM my_contacts;
+----+--------------+------+-------+
| id | location     | city | state |
+----+--------------+------+-------+
| 1  | Chester,NJ   | NULL | NULL  |
| 2  | Katy,TX      | NULL | NULL  |
| 3  | San Mateo,CA | NULL | NULL  |
+----+--------------+------+-------+
3 rows in set (0.00 sec)

我运行以下命令:
INSERT INTO my_contacts (city,state)
VALUES
(SUBSTRING_INDEX(location,',',1),RIGHT(location,2));

我的目的是用 city 列中逗号前的部分和逗号后的部分填充 statelocation 列。
但是我的 table 发生了以下情况:
mysql> INSERT INTO my_contacts (city,state)
    -> VALUES
    -> (SUBSTRING_INDEX(location,',',1),RIGHT(location,2));
Query OK, 1 row affected (0.02 sec)

mysql> SELECT * FROM my_contacts;
+----+--------------+------+-------+
| id | location     | city | state |
+----+--------------+------+-------+
|    | NULL         | NULL | NULL  |
| 1  | Chester,NJ   | NULL | NULL  |
| 2  | Katy,TX      | NULL | NULL  |
| 3  | San Mateo,CA | NULL | NULL  |
+----+--------------+------+-------+
4 rows in set (0.00 sec)

我得到一条记录,作为主键的 id 是空的。这怎么可能?
我的意思是它不是 NULL 但主键也不应该为空,对吗?

最佳答案

您将 id 字段定义为 varchar,当您使用它来存储整数时,这是一个愚蠢的想法。空字段是 NOT null。零长度字符串仍然是有效字符串,因此就您的表而言,它是一个有效的 id 值。尝试插入 ANOTHER 空白字符串,你会得到一个主键冲突:

INSERT INTO yourtable (id) VALUES (''); // will not work
id 字段应该是 int 类型。那将不允许“空”值。

关于mysql - 主键可以为空吗?如果是的话,为什么这个改变会导致这个结果?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15733755/

10-16 17:21