假设我有这个:
ALTER TABLE asdf ADD field ENUM('Y', 'N') DEFAULT 'N';
把 NOT NULL 放在最后是必要的吗,因为它只能是 Y 和 N?
根据评论,如果我知道该软件始终将其设置为“N”或“Y”并且是硬编码的,那么是否可以省略它,或者仍然可能变为空值?
假设我有这个:
ALTER TABLE asdf ADD field ENUM('Y', 'N') DEFAULT 'N';
把 NOT NULL 放在最后是必要的吗,因为它只能是 Y 和 N?
根据评论,如果我知道该软件始终将其设置为“N”或“Y”并且是硬编码的,那么是否可以省略它,或者仍然可能变为空值?
如果在列定义中没有指定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。(有趣的是,它将截断无效的值并允许空字符串,但这是另一个问题)
如果要为具有NOT NULL约束的列设置默认值“N”,请执行以下操作:
ALTER TABLE asdf ADD field ENUM('N', 'Y') NOT NULL;
解释:根据MySQL参考手册:
如果ENUM列被声明为NOT NULL,则其默认值是允许列表中的第一个元素。
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
不需要,它会将其默认为“N”,正如您可能期望的那样。
编辑:评论者让我去测试了一下,除非您希望null成为有效值,否则应添加not null
。如果您在插入或更新中将值设置为null,它将插入一个具有null值的行,因此您可能不希望使用default 'N'
。