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 NULLDEFAULT不是多余的。 特别是, NOT NULL可以对查询性能产生巨大的影响,正如本文中的博客文章所解释的

即使使用默认值,也可以始终使用null覆盖列数据。

NOT NULL限制不会让您在使用null值创build之后更新该行

我的SQL老师说,如果你同时指定一个DEFAULT值和NOT NULLNULLDEFAULT应该总是在NOT NULLNULL之前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。

如果设置的不是空值,那么您不能在该字段中插入空值,因为它会引发错误。

把它看作是一个防止空值的安全机制。