添加具有初始(但不是默认)值的新列的最佳方法?

时间:2009-06-25 05:02:45

标签: sql sql-server database alter-table

我需要使用初始值向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并放入数据库特定的知识。

请,必须有更好的方法。

5 个答案:

答案 0 :(得分:16)

我先ALTER TABLE tbl ADD col INTEGER CONSTRAINT tempname DEFAULT 1,然后删除明确命名的约束(可能是在交易中)。

答案 1 :(得分:14)

要使用默认值添加列,然后删除默认值,您可以命名默认值:

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不会向我显示alter table语句的查询计划,因此我无法比较两种方法之间使用的资源。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

另一种也许是更原生的方式是:

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

我不确定该功能的存在时间,但是PostgreSQL documentation可以回溯到7.1版,而对于7.1版已经有描述。

答案 4 :(得分:0)

如果在创建表时添加默认约束,则无法知道它的名称。但是,如果使用ALTER TABLE添加约束,则必须为约束命名。在这种情况下,您可以使用ALTER TABLE DROP CONSTRAINT(这适用于T-SQL,不确定其他数据库。)

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

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

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