我已经多次看到以下语法,该语法定义了create / alter DDL语句中的列:
ALTER TABLE tbl ADD COLUMN col VARCHAR(20) NOT NULL DEFAULT "MyDefault"
问题是:由于指定了默认值,是否还需要指定该列不应该接受NULL?换句话说,DEFAULT是否不使NOT NULL变得多余?
Answers:
DEFAULT
是在insert / update语句中没有显式值的情况下将要插入的值。让我们假设,您的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标准使用DEFAULT
inUPDATE
语句:
-- 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
语句仍然有效。因此,请回答您的问题:不,它们不是多余的。
我的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
我不会说。
如果该列确实接受空值,那么没有什么可阻止您将空值插入字段的。据我所知,默认值仅适用于创建新行。
如果未设置null,那么您将无法在字段中插入null值,因为它将引发错误。
将其视为防止空值的故障安全机制。