繁体   English   中英

ALTER TABLE不让我设置NULL或默认值?

[英]ALTER TABLE not letting me set NULL or default value?

我试图更改表中的现有列,我必须允许空值,然后将默认值设置为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)

谁能看到我在这里做错了什么?

它是一个主键,mysql不允许主键的任何部分为null,这确实使得它允许form_id奇数的默认值为null,但是文档在

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

说“ 查询性能会从NOT NULL优化中受益,因为它不能包含任何NULL值 ”。

出于好奇,它实际上是否允许您在form_id字段中输入空值?

您有2个不可为空的列,其默认值为null。 您的数据库引擎不应该允许这样做。 如果是,那就远离最佳实践。

sub_id被列为主键

MySQL文档 (5.7,但其他版本说同样的事情):

PRIMARY KEY是一个唯一索引,其中所有键列必须定义为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文档

如果列不能将NULL作为值,则MySQL定义没有显式DEFAULT子句的列。 例外:如果列被定义为PRIMARY KEY的一部分但未显式为NOT NULL,则MySQL将其创建为NOT NULL列(因为PRIMARY KEY列必须为NOT NULL),但也使用隐式默认值为其分配DEFAULT子句值。 要防止这种情况,请在任何PRIMARY KEY列的定义中包含显式的NOT NULL。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM