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

时间:2010-01-13 17:46:51

标签: mysql

让我说我有这个:

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

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

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

5 个答案:

答案 0 :(得分:15)

如果未在列定义中指定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。 (有趣的是,它会截断无效值并允许空字符串,但这是一个不同的问题)

答案 1 :(得分:9)

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

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

说明:根据MySQL reference manual

  

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

答案 2 :(得分:1)

在ENUM数据类型中,如果您不声明NOT NULL,则它将提供默认值NULL。但是,如果您声明NOT NULL,那么它将给出ENUM中的第一个值。

答案 3 :(得分: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

答案 4 :(得分:-1)

没有,根本没有必要,它会将它默认为'N',因为你可能期待。

编辑:评论者让我开始测试,你应该添加not null,除非你想让null成为有效值。如果将列从插入SQL中删除,default 'N'将默认为N,但如果在插入或更新中将值设置为null,则会为值插入一行为null,因为您可能不会想。