【发布时间】:2019-02-04 14:18:46
【问题描述】:
考虑以下空表(如无行):
CREATE TABLE my_table(
my_column CHAR(10) NOT NULL
);
尝试添加不带 DEFAULT 的 NOT NULL 列将失败:
ALTER TABLE my_table ADD my_new_column CHAR(10) NOT NULL;
Error:
*[Code: 4997, SQL State: S1000]
ALTER TABLE my_table failed.
Default clause is required in order to add non-NULL column 'my_new_column'.
但是将列添加为 NULL 然后将其更改为 NOT NULL 将起作用:
ALTER TABLE my_table ADD my_new_column CHAR(10) NULL;
ALTER TABLE my_table MODIFY my_new_column CHAR(10) NOT NULL;
设置默认值然后删除默认值也可以:
ALTER TABLE my_table ADD my_new_column CHAR(10) DEFAULT '' NOT NULL;
ALTER TABLE my_table REPLACE my_new_column DEFAULT NULL;
这种行为的理由是什么?直接添加列失败的数据库在内部尝试做什么?我感觉这可能与内部版本控制有关,但我在这方面找不到任何东西。
【问题讨论】:
-
我建议您再次运行测试,但这次在表格中包含一些数据;回复我们哪些命令成功与失败......这应该让您对正在发生的事情有更多的了解(例如,该命令是否只是修改架构?是该命令创建一个新表并从旧表复制数据?是在解析/编译阶段产生的错误信息吗?是在执行阶段产生的错误信息吗?)
-
这是众所周知的,并且很明显为什么您不能在没有 DEFAULT 的情况下将 NOT NULL 列添加到已经有行的表中,这是因为引擎需要一个值来填充先前存在的新行柱子。我的问题是关于为什么这会发生在一个空的表上。
标签: sql sybase default-value sap-ase