2013-05-08 54 views
5

我想在一個表中我必須允許空值,然後設置默認值設置爲null更改現有列。我試着運行下面的,但它似乎並沒有被更新表:ALTER TABLE不讓我設置NULL或默認值?

mysql> ALTER TABLE answers_form MODIFY sub_id int unsigned NULL DEFAULT NULL; 
Query OK, 0 rows affected (0.00 sec) 
Records: 0 Duplicates: 0 Warnings: 0 

mysql> desc answers_form; 
+--------------+------------------+------+-----+---------+-------+ 
| Field  | Type    | Null | Key | Default | Extra | 
+--------------+------------------+------+-----+---------+-------+ 
| answer_id | int(10) unsigned | NO | PRI | 0  |  | 
| sub_id  | int(10) unsigned | NO | PRI | 0  |  | 
| form_id  | int(10) unsigned | NO | PRI | NULL |  | 
| value  | varchar(255)  | NO |  | NULL |  | 
| non_response | bit(1)   | YES |  | b'0' |  | 
+--------------+------------------+------+-----+---------+-------+ 
5 rows in set (0.01 sec) 

有人能看到我在做什麼錯在這裏?

+0

難道你可以不設置此列可爲空,因爲它是主鍵的一部分嗎? – 2013-05-08 22:18:57

回答

4

其主鍵,MySQL不允許主鍵的任何部分爲null,這確實讓事實,即它允許空爲form_id奇,但是在文檔

默認值http://dev.mysql.com/doc/refman/5.5/en/optimizing-primary-keys.html

說「查詢性能受益於NOT NULL優化,因爲它不能包含任何NULL值」。

只是出於好奇,它實際上讓你把空值在form_id領域?

+0

你可以做一點[小提琴](http:// sqlfiddle。com)並找出你自己。 – hd1 2013-05-08 22:23:48

+0

我給了它一個鏡頭,沒有我不能插入null。我猜我最好的選擇是在這種情況下使用唯一的密鑰而不是主鍵? – 2013-05-08 22:38:52

+0

好的,儘管desc的輸出是誤導性的,但至少該行爲與文檔一致。是的,一個唯一的鍵,甚至更美味,引入兩個新的表加入:)例如,SUB_ASSOC(answer_id,sub_id)和FORM_ASSOC(answer_id,sub_id)。然後,你可以做兩件留在這些表中的連接,和值爲空返回,如果沒有存在(不填充惱人的空:)我有NOT NULL OCD笑數據庫) – JustDanyul 2013-05-08 23:10:36

1

你有2個與空的默認值非空列。這不應該被你的數據庫引擎所允許。如果是這樣,這與最佳做法相去甚遠。

+0

'form_id'是一個可爲空的列,它是主鍵的一部分,儘管... – 2013-05-08 22:32:40

+0

@Abe,我在'NULL'默認值的關於Non nullable列的答案中添加了一些額外的信息。 – MichaelJCox 2013-05-08 22:49:15

1

sub_id被列爲一個主鍵

MySQL docs(5.7,但其他版本說同樣的話):

主鍵是所有鍵列必須被定義的唯一索引 作爲NOT NULL。如果它們沒有被顯式聲明爲NOT NULL,那麼MySQL 會聲明(並且默默地)聲明它們。

至於有關具有NULL默認的非空列的討論...

Default列中的值NULL意味着沒有默認,而不是默認的是NULL

小提琴:http://sqlfiddle.com/#!2/c718d/1

如果我創建一個簡單的表像這樣:

CREATE TABLE name_num(
    Number INT PRIMARY KEY, 
    Name TEXT NOT NULL 
); 

然後做desc name_num,我得到:

| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | 
--------------------------------------------------- 
| Number | int(11) | NO | PRI | (null) |  | 
| Name | text | NO |  | (null) |  | 

再次,從MySQL docs

如果列不能將NULL作爲值,則MySQL將定義沒有明確DEFAULT子句的列。例外:如果列被定義爲一個主鍵的一部分,但沒有明確爲NOT NULL,MySQL的將其創建爲NOT NULL列(因爲主鍵列必須爲NOT NULL),而且還賦予它使用隱含的默認的DEFAULT子句值。爲了防止出現這種情況,請在任何PRIMARY KEY列的定義中包含顯式的NOT NULL。

+0

'form_id'是一個可爲空的列,它是主鍵的一部分,儘管... – 2013-05-08 22:30:36

+0

form_id不可爲空(Null NO),但它的默認值爲NULL。 – MichaelJCox 2013-05-08 22:36:35