如何将具有默认值的列添加到SQL Server 2000/SQL Server 2005中的现有表中?


当前回答

这有很多答案,但我觉得有必要添加这个扩展方法。这看起来要长得多,但如果要向活动数据库中有数百万行的表中添加NOT NULL字段,则非常有用。

ALTER TABLE {schemaName}.{tableName}
    ADD {columnName} {datatype} NULL
    CONSTRAINT {constraintName} DEFAULT {DefaultValue}

UPDATE {schemaName}.{tableName}
    SET {columnName} = {DefaultValue}
    WHERE {columName} IS NULL

ALTER TABLE {schemaName}.{tableName}
    ALTER COLUMN {columnName} {datatype} NOT NULL

这将做的是将列添加为可空字段,并使用默认值将所有字段更新为默认值(或者您可以分配更多有意义的值),最后将列更改为NOT NULL。

这样做的原因是,如果您更新一个大型表并添加一个新的非空字段,它必须写入每一行,因此在添加列并写入所有值时将锁定整个表。

此方法将添加可为空的列,该列本身运行速度快得多,然后在设置非空状态之前填充数据。

我发现,在一个语句中完成整个操作将在4-8分钟内锁定一个更活跃的表,而且我经常会终止这个过程。这种方法每一部分通常只需几秒钟,并导致最小的锁定。

此外,如果您有一个表,其面积为数十亿行,则可能值得按如下方式批量更新:

WHILE 1=1
BEGIN
    UPDATE TOP (1000000) {schemaName}.{tableName}
        SET {columnName} = {DefaultValue}
        WHERE {columName} IS NULL

    IF @@ROWCOUNT < 1000000
        BREAK;
END

其他回答

IF NOT EXISTS (
    SELECT * FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME ='TABLENAME' AND COLUMN_NAME = 'COLUMNNAME'
)
BEGIN
    ALTER TABLE TABLENAME ADD COLUMNNAME Nvarchar(MAX) Not Null default
END

语法:

ALTER TABLE {TABLENAME} 
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL} 
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
WITH VALUES

例子:

ALTER TABLE SomeTable
        ADD SomeCol Bit NULL --Or NOT NULL.
 CONSTRAINT D_SomeTable_SomeCol --When Omitted a Default-Constraint Name is autogenerated.
    DEFAULT (0)--Optional Default-Constraint.
WITH VALUES --Add if Column is Nullable and you want the Default Value for Existing Records.

笔记:

可选约束名称:如果忽略CONSTRAINT D_SomeTable_SomeCol,则SQL Server将自动生成具有有趣名称的默认对照,如:DF__SomeTa__SomeC_4FB7FEF6

可选值声明:只有当列为空时,才需要WITH VALUES并且您希望将默认值用于现有记录。如果您的列不是NULL,那么它将自动使用默认值对于所有现有记录,无论是否指定WITH VALUES。

插入件如何使用默认约束:如果在SomeTable中插入一条记录,但未指定SomeCol的值,则它将默认为0。如果插入Record并将SomeCol的值指定为NULL(并且您的列允许为空),则将不使用默认约束,并且将插入NULL作为值。

笔记基于下面每个人的反馈。特别感谢:@Yatrix、@WalterStabosz、@YahooSerious和@StackMan的评论。

在SQL Server 2008-R2中,我进入设计模式(在测试数据库中),使用设计器添加我的两列,并使用GUI进行设置,然后臭名昭著的右键单击提供了“生成更改脚本”选项!

突然弹出一个小窗口,你猜到了,里面有格式正确的保证可以工作的更改脚本。按下简易按钮。

这也可以在SSMS GUI中完成。我在下面显示了默认日期,但默认值当然可以是任何值。

将表放在设计视图中(右键单击对象中的表浏览器->设计)向表中添加列(或单击要更新的列,如果它已经存在)在下面的列财产中,在默认值或绑定字段中输入(getdate())或“abc”或0或任何您想要的值,如下图所示:

当要添加的列具有NOT NULL约束,但没有DEFAULT约束(值)时,请注意。在这种情况下,如果表中有任何行,ALTER TABLE语句将失败。解决方案是从新列中删除NOT NULL约束,或为其提供DEFAULT约束。