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

新手上路,请多包涵

我多次看到以下语法在创建/更改 DDL 语句中定义列:

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

问题是:既然指定了默认值,是否还需要指定该列不应该接受 NULL s?换句话说, DEFAULT 渲染 NOT NULL 不是多余的吗?

原文由 Razvan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 263
2 个回答

DEFAULT 是在插入/更新语句中没有显式值的情况下插入的值。假设,您的 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 仍然是有效的语句。所以回答你的问题:不,它们不是多余的。

原文由 Lukas Eder 发布,翻译遵循 CC BY-SA 4.0 许可协议

My SQL teacher said that if you specify both a DEFAULT value and NOT NULL or NULL , DEFAULT should always be expressed before NOT NULLNULL

像这样:

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

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

原文由 Tanguy Labrador Ruiz 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进