我正在尝试更改表中的现有列,我必须允许空值,然后将默认值设置为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 :(得分:4)
它是一个主键,mysql不允许主键的任何部分为null,这确实使得它允许form_id奇数的默认值为null,但是
的文档http://dev.mysql.com/doc/refman/5.5/en/optimizing-primary-keys.html
说“查询性能可以从NOT NULL优化中获益,因为它不能包含任何NULL值”。
出于好奇,它是否真的允许你在form_id字段中输入空值?
答案 1 :(得分:1)
您有2个不可为空的列,其默认值为null。您的数据库引擎不应该允许这样做。如果是,那就远远不是最佳做法。
答案 2 :(得分:1)
sub_id被列为主键
从MySQL docs(5.7,但其他版本说同样的事情):
PRIMARY KEY是一个唯一索引,其中必须定义所有键列 作为NOT NULL。如果它们没有显式声明为NOT NULL,那么MySQL 如此隐含地(并且默默地)声明它们。
关于非空列的讨论,其默认值为NULL
...
NULL
列中的Default
值表示没有默认值,而不是默认值为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子句的列。例外:如果列被定义为PRIMARY KEY的一部分但未显式为NOT NULL,则MySQL将其创建为NOT NULL列(因为PRIMARY KEY列必须为NOT NULL),但也使用隐式默认值为其分配DEFAULT子句值。为防止这种情况,请在任何PRIMARY KEY列的定义中包含显式的NOT NULL。