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

Sql 添加具有初始(但不是默认)值的新列的最佳方法?,sql,sql-server,database,alter-table,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 对于较大的表(100000到1

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

我能想到的最好办法是:

ALTER TABLE tbl ADD col INTEGER NULL
UPDATE tbl SET col = 1
ALTER TABLE tbl ALTER COLUMN col INTEGER NOT NULL
对于较大的表(100000到1000000条记录),这似乎有点低效

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


请,一定有更好的方法。

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

我想
先更改表tbl添加列整数约束tempname DEFAULT 1
,然后删除后面显式命名的约束(可能在事务中)。

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

然而,这将需要您创建具有NULL列的表,更改表以添加约束,使列不为NULL,最后删除约束

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


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

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

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
,在一个包含100000行的小表格上没有看到任何明显的差异。SSMS不会向我显示alter table语句的查询计划,因此我无法比较两种方法之间使用的资源。

另一种可能更自然的方法是:

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

我不确定这个函数存在多长时间,但可以追溯到7.1版,对于7.1版,它已经被描述过了。

这正是我的想法。顺便说一句,您是否不想作为约束条件执行此操作?问题是如何将列添加到包含现有行的表中。添加触发器只会影响新行。我遗漏了什么吗?我想我误解了这个问题。当您说要添加具有初始值的列时,您的意思是希望所有现有行都具有此值而不必更新它们吗?在本例中,可以添加两列。一个是可空列,另一个是计算列。如果另一列为空,则计算列将返回默认值,否则将返回另一列。这是一个非常复杂的未来。我宁愿像你在例子中那样做@亚历克斯:我不确定一个人能在一段时间内完成DDL@阿德里安:你真的在乎它效率低下吗?你不是每天都这么做,是吗?通常,为了清晰起见,我使用您描述的方式。@van,我不能100%确定SqlServer'05在这方面的局限性——PostgreSQL确实允许您以事务方式更改表(至少使用显式的事务开始和提交)。若要检查MS是否也这样做,请选择@TRANCOUNT应该告诉您(我在文档中找不到明确的说明)。@van&@Alex MS SQL Server在事务中执行DDL。这是与@Alex类似的解决方案,但有更完整的解释。