我有下表:
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));
我的目的是用 location
列中逗号前的部分和逗号后的部分填充 city
和 state
列.
但是我的表发生了以下情况:
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/