28

我需要在 MS SQL 2005 数据库中添加一个具有初始值的新列。但是,我不想在此列上自动创建默认约束。在我添加列的时间点,默认/初始值是正确的,但这可能会随着时间而改变。因此,将来对表的访问必须指定一个值而不是接受默认值。

我能想到的最好的是:

ALTER TABLE tbl ADD col INTEGER NULL
UPDATE tbl SET col = 1
ALTER TABLE tbl ALTER COLUMN col INTEGER NOT NULL

对于大型表(100,000 到 1,000,000 条记录),这似乎有点低效。

我已经尝试添加具有默认值的列,然后删除默认约束。但是,我不知道默认约束的名称是什么,并且宁愿不访问 sysobjects 并输入数据库特定的知识。

拜托,一定有更好的方法。

4

5 回答 5

18

要添加具有默认值的列然后删除默认值,您可以将默认值命名为:

ALTER TABLE tbl ADD col INTEGER NOT NULL CONSTRAINT tbl_temp_default DEFAULT 1
ALTER TABLE tbl drop constraint tbl_temp_default

这填充了值 1,但没有默认值。使用 SQL Server 2008,我运行了此代码和您的代码,alter update alter但在 100,000 个小行的表上没有看到任何明显的差异。SSMS 不会向我显示更改表语句的查询计划,因此我无法比较两种方法之间使用的资源。

于 2009-06-25T05:32:58.660 回答
17

ALTER TABLE tbl ADD col INTEGER CONSTRAINT tempname DEFAULT 1首先,然后删除显式命名的约束(大概在事务中)。

于 2009-06-25T05:10:58.563 回答
2

另一种可能更本地化的方式是:

ALTER TABLE tbl ADD COLUMN col INTEGER NOT NULL DEFAULT 1;
ALTER TABLE tbl ALTER COLUMN col DROP DEFAULT;

我不确定这个函数存在多长时间,但PostgreSQL 文档可以追溯到 7.1 版,并且对于 7.1 版已经进行了描述。

于 2019-08-12T10:46:48.003 回答
1

您可以在插入触发器中执行此操作

于 2009-06-25T05:10:34.227 回答
0

如果在创建表时添加了默认约束,您将不知道它叫什么。但是,如果您使用 ALTER TABLE 添加约束,则必须命名该约束。在这种情况下,您将能够 ALTER TABLE DROP CONSTRAINT (这适用于 T-SQL,不确定其他数据库。)

但是,这将要求您使用 NULL 列创建 TABLE,更改 TABLE 以添加约束,使列 NOT NULL,最后 DROP CONSTRAINT。

我不相信插入触发器会像其他人提到的那样工作,因为您的行已经添加。

我认为您描述的方式实际上可能是最有效和最优雅的解决方案。

于 2009-06-25T05:15:19.090 回答