2013-05-08 145 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