MySQL中的枚举是否需要为NOT NULL?

use*_*033 14 mysql

让我说我有这个:

ALTER TABLE asdf ADD field ENUM('Y', 'N') DEFAULT 'N';
Run Code Online (Sandbox Code Playgroud)

是否需要一个NOT NULL,因为它只能是Y和N?

EDT:基于评论,如果我知道软件总是将其设置为'N'或'Y'并且是硬编码然后可以将其关闭或者它仍然可能在某些方面变为空.

Ian*_*and 18

如果未NOT NULL在列定义中指定,MySQL将允许该值为NULL .

这是一个快速测试:

mysql> create table test (id serial, field ENUM('Y','N') DEFAULT 'N');
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO test (field) VALUES ('Y');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO test (field) VALUES ('N');
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO test () VALUES ();
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO test (field) VALUES (NULL);
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO test (field) VALUES ('Invalid');
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> show warnings;
+---------+------+--------------------------------------------+
| Level   | Code | Message                                    |
+---------+------+--------------------------------------------+
| Warning | 1265 | Data truncated for column 'field' at row 1 | 
+---------+------+--------------------------------------------+
1 row in set (0.00 sec)

mysql> select * from test;
+----+-------+
| id | field |
+----+-------+
|  1 | Y     | 
|  2 | N     | 
|  3 | N     | 
|  4 | NULL  | 
|  5 |       | 
+----+-------+
5 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

所以MySQL确实尊重默认值,但也允许NULL.(有趣的是,它会截断无效值并允许空字符串,但这是一个不同的问题)


Igw*_*alu 11

要为具有NOT NULL约束的列设置默认值"N",请执行以下操作:

ALTER TABLE asdf ADD field ENUM('N', 'Y') NOT NULL;
Run Code Online (Sandbox Code Playgroud)

说明:根据MySQL参考手册:

如果ENUM列声明为NOT NULL,则其默认值是允许列表的第一个元素


Par*_*ots -1

不,根本没有必要,它只是将其默认为“N”,正如您可能期望的那样。

编辑:评论者让我去测试这个,你应该添加not null,除非你希望 null 是一个有效值。如果您将该列保留在插入 SQL 之外, Havingdefault 'N'将默认它为 N,但如果您在插入或更新中将该值设置为 null,它将插入一个值为 null 的行,正如您可能不希望的那样。

  • 阅读http://dev.mysql.com/doc/refman/5.1/en/enum.html(“如果一个ENUM列被声明允许NULL,则NULL值是该列的合法值,默认值为NULL。”)我相信可以成功地在此列中插入 NULL。 (2认同)