MySQL中的枚举(enum)需要设置为NOT NULL吗?

17

假设我有这个:

ALTER TABLE asdf ADD field ENUM('Y', 'N') DEFAULT 'N';

把 NOT NULL 放在最后是必要的吗,因为它只能是 Y 和 N?

根据评论,如果我知道该软件始终将其设置为“N”或“Y”并且是硬编码的,那么是否可以省略它,或者仍然可能变为空值?

5个回答

24

如果在列定义中没有指定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)

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


12

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

ALTER TABLE asdf ADD field ENUM('N', 'Y') NOT NULL;

解释:根据MySQL参考手册

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


4
在ENUM数据类型中,如果您没有声明NOT NULL,则会得到默认值NULL。但是,如果您声明了NOT NULL,则会得到ENUM的第一个值。

0

Ian Clelland的回答很好,但需要更多细节:

   mysql> CREATE TABLE en1(en enum('A','B') DEFAULT 'A',sets set('A','B') DEFAULT '
    B');
    Query OK, 0 rows affected (0.03 sec)

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

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

    mysql> SELECT * FROM en1;
    +------+------+
    | en   | sets |
    +------+------+
    | A    | B    |
    | NULL | NULL |
    +------+------+
    2 rows in set (0.00 sec)

    mysql> CREATE TABLE en2(en enum('A','B') DEFAULT 'A' NOT NULL,sets set('A','B')
    DEFAULT 'B' NOT NULL);
    Query OK, 0 rows affected (0.05 sec)

    mysql> INSERT INTO en2 VALUES(NULL,NULL);
    ERROR 1048 (23000): Column 'en' cannot be null

-1

不需要,它会将其默认为“N”,正如您可能期望的那样。

编辑:评论者让我去测试了一下,除非您希望null成为有效值,否则应添加not null。如果您在插入或更新中将值设置为null,它将插入一个具有null值的行,因此您可能不希望使用default 'N'


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接