我有下表:
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
列中逗号前的部分和逗号后的部分填充 state
和 location
列。但是我的 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/