我见过很多次以下语法定义在创建/修改DDL语句列:
ALTER TABLE tbl ADD COLUMN col VARCHAR(20) NOT NULL DEFAULT "MyDefault"
现在的问题是:因为指定的默认值,是有必要还可以指定该列不应该接受NULL值? 换句话说,不会默认渲染NOT NULL多余的?
我见过很多次以下语法定义在创建/修改DDL语句列:
ALTER TABLE tbl ADD COLUMN col VARCHAR(20) NOT NULL DEFAULT "MyDefault"
现在的问题是:因为指定的默认值,是有必要还可以指定该列不应该接受NULL值? 换句话说,不会默认渲染NOT NULL多余的?
DEFAULT
是将在插入/更新语句没有一个明确的值插入值。 让我们假设,你的DDL没有了NOT NULL
约束:
ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault"
然后,你可以发出这些语句
-- 1. This will insert "MyDefault" into tbl.col
INSERT INTO tbl (A, B) VALUES (NULL, NULL);
-- 2. This will insert "MyDefault" into tbl.col
INSERT INTO tbl (A, B, col) VALUES (NULL, NULL, DEFAULT);
-- 3. This will insert "MyDefault" into tbl.col
INSERT INTO tbl (A, B, col) DEFAULT VALUES;
-- 4. This will insert NULL into tbl.col
INSERT INTO tbl (A, B, col) VALUES (NULL, NULL, NULL);
另外,您也可以使用DEFAULT
的UPDATE
语句,根据SQL 1992标准:
-- 5. This will update "MyDefault" into tbl.col
UPDATE tbl SET col = DEFAULT;
-- 6. This will update NULL into tbl.col
UPDATE tbl SET col = NULL;
请注意,并非所有的数据库都支持所有这些SQL标准语法。 添加NOT NULL
约束将导致与语句错误4, 6
,而1-3, 5
仍然是有效的语句。 因此,要回答你的问题:
不, NOT NULL
和DEFAULT
不是多余的。 特别是, NOT NULL
可以对查询性能产生巨大影响这里的这个博客帖子解释
即使有一个默认值,你可以随时与覆盖列数据null
。
该NOT NULL
限制不会让你更新这一行它与创建后null
值
我的SQL老师说,如果你指定一个DEFAULT
值, NOT NULL
或NULL
, DEFAULT
应始终表达过NOT NULL
或NULL
。
像这样:
ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault" NOT NULL
ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault" NULL
我会说没有。
如果列不接受空值,那么没有什么可以阻止你插入一个空值到现场,据我所知,默认值仅适用于创建一个新的规则。
随着不空集,那么你就不能插入一个空值进入该领域,因为它会抛出一个错误。
把它看成是一个故障安全机制,以防止空。