我已经多次看到以下在create / alter DDL语句中定义列的语法:
ALTER TABLE tbl ADD COLUMN col VARCHAR(20) NOT NULL DEFAULT "MyDefault"
问题是:由于指定了默认值,是否还需要指定该列不应该接受NULL?换句话说,DEFAULT是否不使NOT NULL变得多余?
DEFAULT是在insert / update语句中没有显式值的情况下将要插入的值。让我们假设,您的DDL没有NOT NULL约束:
DEFAULT
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标准使用DEFAULTinUPDATE语句:
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;
注意,并非所有数据库都支持所有这些SQL标准语法。添加NOT NULL约束将导致statement出错4, 6,而1-3, 5仍然是有效的statement。因此,请回答您的问题:不,它们不是多余的。
4, 6
1-3, 5