6

我正在尝试更改表中的现有列,我必须允许空值,然后将默认值设置为空。我尝试运行以下命令,但似乎没有更新表:

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)

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

4

3 回答 3

5

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

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

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

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

于 2013-05-08T22:19:27.003 回答
1

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

于 2013-05-08T22:22:49.413 回答
1

sub_id 被列为主键

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

PRIMARY KEY 是一个唯一索引,其中所有键列都必须定义为 NOT NULL。如果它们没有被显式声明为 NOT NULL,MySQL 会隐含地(并且默默地)声明它们。

至于关于具有默认值的非空列的讨论NULL......

列中的NULLDefault表示没有默认值,而不是默认值是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。

于 2013-05-08T22:26:11.353 回答