Raz*_*van 71 sql ddl default-value notnull
我已经多次看到以下语法定义了create/alter DDL语句中的列:
ALTER TABLE tbl ADD COLUMN col VARCHAR(20) NOT NULL DEFAULT "MyDefault"
Run Code Online (Sandbox Code Playgroud)
问题是:由于指定了默认值,是否还需要指定列不应该接受NULL?换句话说,DEFAULT不会呈现NOT NULL冗余吗?
Luk*_*der 99
DEFAULT是插入/更新语句中缺少显式值时将插入的值.让我们假设,您的DDL没有NOT NULL约束:
ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault"
Run Code Online (Sandbox Code Playgroud)
然后你可以发布这些声明
-- 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);
Run Code Online (Sandbox Code Playgroud)
或者,您也可以根据SQL-1992标准使用DEFAULTin UPDATE语句:
-- 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;
Run Code Online (Sandbox Code Playgroud)
请注意,并非所有数据库都支持所有这些SQL标准语法.添加NOT NULL约束将导致语句出错4, 6,同时1-3, 5仍然是有效语句.所以回答你的问题:
不,DEFAULT而且NOT NULL不是多余的.特别是,DEFAULT可以对查询性能产生巨大影响,如本博客文章中所述
Tam*_*mir 15
即使使用默认值,也可以始终使用覆盖列数据null.
NOT NULL在使用nullvalue 创建该行后,该限制将不允许您更新该行
我的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