让我说我有这个:
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 的行,正如您可能不希望的那样。