SQL列定义:默认值和非空冗余?
我已经多次看到以下在create / alter DDL语句中定义列的语法:
ALTER TABLE tbl ADD COLUMN col VARCHAR(20) NOT NULL DEFAULT "MyDefault"
问题是:既然指定了一个默认值,是否有必要指定列不应该接受NULL? 换句话说,不是DEFAULT呈现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);
另外,根据SQL-1992标准,您还可以在UPDATE
语句中使用DEFAULT
:
-- 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
值创build之后更新该行
我的SQL老师说,如果你同时指定一个DEFAULT
值和NOT NULL
或NULL
, DEFAULT
应该总是在NOT NULL
或NULL
之前expression。
喜欢这个:
ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault" NOT NULL
ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault" NULL
我会说不。
如果列没有接受空值,那么没有什么可以阻止你在字段中插入空值,据我所知,默认值只适用于新规则的创build。
如果设置的不是空值,那么您不能在该字段中插入空值,因为它会引发错误。
把它看作是一个防止空值的安全机制。