SQL列定义:默认值,而不是空多余的?(SQL Column definition : defaul

2019-06-26 20:35发布

我见过很多次以下语法定义在创建/修改DDL语句列:

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) NOT NULL DEFAULT "MyDefault"

现在的问题是:因为指定的默认值,是有必要还可以指定该列不应该接受NULL值? 换句话说,不会默认渲染NOT NULL多余的?

Answer 1:

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);

另外,您也可以使用DEFAULTUPDATE语句,根据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 NULLDEFAULT不是多余的。 特别是, NOT NULL可以对查询性能产生巨大影响这里的这个博客帖子解释



Answer 2:

即使有一个默认值,你可以随时与覆盖列数据null

NOT NULL限制不会让你更新这一行它与创建后null



Answer 3:

我的SQL老师说,如果你指定一个DEFAULT值, NOT NULLNULLDEFAULT应始终表达过NOT NULLNULL

像这样:

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault" NOT NULL

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault" NULL



Answer 4:

我会说没有。

如果列不接受空值,那么没有什么可以阻止你插入一个空值到现场,据我所知,默认值仅适用于创建一个新的规则。

随着不空集,那么你就不能插入一个空值进入该领域,因为它会抛出一个错误。

把它看成是一个故障安全机制,以防止空。



文章来源: SQL Column definition : default value and not null redundant?