mysql - 主键可以为空吗?如果是,为什么这个改变会导致这个结果?

标签 mysql sql primary-key alter

我有下表:

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 列中逗号前的部分和逗号后的部分填充 citystate 列.
但是我的表发生了以下情况:

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/

相关文章:

mysql - SQL注入(inject)预防

sql - 带连接的 Postgresql 查询

SQLite - 是否可以使非整数主键工作?

mysql - 多个主键

php - MYSQL自动更新副表查询

c# - MySQL 到数组到 MSSQL 查询语句

mysql - 基于多列计算行数

php - Echo forloop 从 phpmyadmin sql 检索到 div (PHP 文件)

javascript - 使用ajax创建迭代SQL `INSERT`语句

sql - 不能在相关列上使用 where 子句