我需要使用初始值向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并放入数据库特定的知识。
请,必须有更好的方法。
答案 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。
我不相信插入触发器会像其他人提到的那样工作,因为你的行已经添加了。
我认为您描述的方式实际上可能是最有效和最优雅的解决方案。