一尘不染

SQL列定义:默认值和非null冗余吗?

sql

我已经多次看到以下在create / alter DDL语句中定义列的语法:

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

问题是:由于指定了默认值,是否还需要指定该列不应该接受NULL?换句话说,DEFAULT是否不使NOT NULL变得多余?


阅读 159

收藏
2021-05-05

共1个答案

一尘不染

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标准使用DEFAULTinUPDATE语句:

-- 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。因此,请回答您的问题:不,它们不是多余的。

2021-05-05