SQL列定义:默认值而不是空冗余?

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 创建该行后,该限制将不允许您更新该行

  • 我认为应该重新表述:“NOT NULL 限制不会让您在使用 null 值创建该行后更新该行”当然,可以更新具有 NOT NULL 列的行,只是不能使用 null 作为更新该列的值。此外:我假设创建一行意味着插入一行。对于使用 NOT NULL 指定的列,INSERT 语句也不能具有空值。 (2认同)

Tan*_*uiz 5

我的SQL老师说如果你同时指定一个DEFAULT值和NOT NULLNULLDEFAULT应该总是在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 和 NOT NULL 值会更好地对齐。 (5认同)
  • (主观)最佳实践和规则之间存在差异。拥有一致的风格并不是一个坏主意,但在这种特殊情况下,我个人更喜欢在 DEFAULT 之前使用 NOT NULL。无论如何,您也可以写评论而不是答案,这会更合适。 (3认同)