我已经多次看到以下语法定义了create/alter DDL语句中的列:
ALTER TABLE tbl ADD COLUMN col VARCHAR(20) NOT NULL DEFAULT "MyDefault"
问题是:既然指定了默认值,是否还需要指定列不应接受null?换句话说,默认渲染不是空冗余吗?
我已经多次看到以下语法定义了create/alter DDL语句中的列:
ALTER TABLE tbl ADD COLUMN col VARCHAR(20) NOT NULL DEFAULT "MyDefault"
问题是:既然指定了默认值,是否还需要指定列不应接受null?换句话说,默认渲染不是空冗余吗?
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标准,您也可以在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
仍然是有效语句.所以要回答你的问题:不,它们不是多余的.