我已经多次看到以下语法定义了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仍然是有效语句.所以要回答你的问题:不,它们不是多余的.

Sql相关问答推荐

如何将数组列和与Click house中的另一个数组列的元素分组

无法找到正确的SQL查询需求

为什么Postgrs Planner会在输出部分中显示我在查询中不使用的列?'""

如何计算一个用户S的日常连胜?

我可以在SQL的IN子句中使用比子查询包含的值更少的值吗?

在SQL GROUP BY中的某些行之后执行计算

仅在日期相隔时递增(Oracle SQL)

通过对象分离实现原子性

从每月生成的系列中生成每日汇率

JSON_VALUE 不适用于提取的 json 中的嵌套路径

PostgreSQL:从多个字段收集特定指标的最后一个条目

创建具有多个子查询的 SQL 视图

根据要过滤的列的值进行联接和分组

Postgresql 具有相似行为和模式行为的问题

SQL ORACLE - 查找连续天数

如何在 case 语句中使用聚合?

复制SQL Server临时表

BigQuery导航函数计算ID

如何在 SQL Server 中将 -13422.8450 舍入到 -13422.84

在 Microsoft SQL Server 中,如何只为特定值保留不同的行?