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


86

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

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

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

Answers:


126

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约束将导致语句错误4, 6,而1-3, 5语句仍然有效。因此,请回答您的问题:不,它们不是多余的。


我转到了您的链接(指向您的博客文章),期望看到对查询性能的巨大影响的解释(可能有一些数字),但只是短暂地重申了它的影响。没有冒犯,但链接有些误导。
赛斯花

@SethFlowers:感谢您的指导,Seth。链接的文章在此期间进行了编辑。我将看看是否可以链接其他东西,或删除链接。到目前为止,您是完全正确的,它不会为此处的答案增加任何价值。
卢卡斯·埃德

谢谢-希望我听起来不粗鲁。我刚看到链接,就像“是的,那绝对是我想阅读的内容”-然后有点失望:)。
赛斯花

@SethFlowers:不用担心。我完全同意。为了拯救我:在过去的几年里,我的博客技能大大提高了:)
Lukas Eder

19

即使使用默认值,也可以始终使用覆盖列数据null

NOT NULL限制不会让你更新这一行它与创建后null的值


我认为应该改写为:“ NOT NULL限制不会让您在使用空值创建该行后对其进行更新”当然,具有NOT NULL列的行可以进行更新,而不能将它们更新为null该列的值。此外:我认为创建一行意味着插入一行。对于用NOT NULL指定的列,INSERT语句也不能具有空值。
makrom

4

我的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


5
嘿,谢谢您的参与。但是,这并没有解决当前的问题,并且两种排序都完全有效。我发现手动编写表格脚本时更容易将default放在最后,因为这样NULL和NOT NULL值可以更好地对齐。
emragins

好吧,我想你也是对的。我不明白为什么我的课程会明确说明我在答案中写的内容。我知道我的回答并没有真正解决问题,但是我发现注释不太可读。
Tanguy Labrador Ruiz

3
(主观的)最佳实践和规则之间存在差异。拥有一致的样式并不是一个坏主意,但是在这种情况下,我个人更喜欢在DEFAULT之前使用NOT NULL。无论如何,您也可以写评论而不是答案,这样会更合适。
makrom

那可能无法回答问题。但这正是我想要的。谢谢。
浦佐助

2

我不会说。

如果该列确实接受空值,那么没有什么可阻止您将空值插入字段的。据我所知,默认值仅适用于创建新行。

如果未设置null,那么您将无法在字段中插入null值,因为它将引发错误。

将其视为防止空值的故障安全机制。


2
您说的是“创建新规则”。您是否打算说“创建新行”?
bielawski

我认为这是这个问题的更实际答案。
Noman_ibrahim

@bielawski,将近8年后,我开始纠正这种错字:)
Dark Hippo

这应该是公认的答案。OP要求一个简单的问题,答案就是“否”。但是,文档需要说明和示例。
Nicolas Hevia
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.