2013-03-31 71 views
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)); 

我的目的是爲了填充列citystate與逗號之前的部分和從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,但主鍵不應該是空的要麼是嗎?

回答

8

您已定義id場爲VARCHAR,這是你使用它來存儲整數當一個愚蠢的想法。一個空的字段是不是 null。一個零長度的字符串仍然是一個有效的字符串,因此就表格而言,它是一個有效的id值。嘗試插入ANOTHER空字符串,你會得到一個主鍵衝突:

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

id場應該是一個int類型。這將不允許「空」值。

1

這不是空的。這可能是一個空字符串。請注意,數據類型是varchar(20)。

2

主鍵是唯一的,所以如果你改變表,那麼第二行將試圖添加一個空值和失敗。因此,它會嘗試下一個可能的價值。如果你想讓第一個值不爲空,你可以設置一個默認值。

1

好了,你沒有分配一個值主鍵字段,因此默認值爲NULL。 。 你想要修改表,所以主鍵是auto_increment

+0

'default'對於'Primary key'是'NULL'?這怎麼可能?不是不允許的嗎? – Cratylus

1

您可以使用varchar作爲與另一個數據庫表相關的外鍵,但是如果您希望將其用作數字鍵,則應該使用數字數據類型,如int

0

我知道這並不能回答有關主鍵的確切問題,但是由於您的問題確實指出了您也有問題從您的位置列中解析出城市和州,因此您需要查詢(注意你想要一個更新修改現有的行,而不是一個INSERT,它會添加新的行而不是列):

UPDATE my_contacts 
SET 
    city = substr(location, 1, locate(',', location) - 1), 
    state = substr(location, locate(',', location) + 1); 
相關問題