4

我有下表:

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
但以下发生在我的桌子上:

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,但主键也不应该是空的,对吧?

4

6 回答 6

9

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

INSERT INTO yourtable (id) VALUES (''); // will not work

id字段应该是一个int类型。那将不允许“空”值。

于 2013-03-31T19:50:18.567 回答
2

主键是唯一的,因此如果您更改表,则第二行将尝试添加空值并失败。结果,它将尝试下一个可能的值。如果您希望第一个值不为空,您可以设置一个默认值。

于 2013-03-31T19:50:30.397 回答
1

它不是空的。它可能是一个空字符串。请注意,数据类型是 varchar(20)。

于 2013-03-31T19:50:30.377 回答
1

好吧,您没有为主键字段分配值,因此默认值为 NULL。. 您要修改表,使主键为auto_increment.

于 2013-03-31T19:50:31.160 回答
1

您可以将 avarchar用作与另一个数据库表相关的外键,但如果您希望将其用作数字键,则应使用数字数据类型,例如int.

于 2013-03-31T19:51:53.540 回答
0

我知道这并不能回答有关主键的确切问题,但是正如您的问题确实指出了您在从位置列解析城市和州时也遇到问题的事实,这是您要使用的查询(注意你想要一个 UPDATE 来修改现有的行,而不是一个将添加新行而不是列的 INSERT):

UPDATE my_contacts
SET
    city = substr(location, 1, locate(',', location) - 1),
    state = substr(location, locate(',', location) + 1);
于 2014-08-23T00:28:05.000 回答