【问题标题】:How do I add a default value in SQL Server after the table has been created?创建表后如何在 SQL Server 中添加默认值?
【发布时间】:2012-05-21 13:30:38
【问题描述】:

所以,我已经创建了我的数据库,但现在需要为表中的字段添加默认值。我想知道如何在不必删除一半表和约束的情况下做到这一点。

我在网上看了,上面说要用这个:

ALTER TABLE TABLE_NAME
ALTER COLUMN ColumnName
SET DEFAULT 1234;

但是,我尝试使用它,但我收到“关键字 'SET' 附近的语法不正确”。我是否遗漏了一些非常明显的东西?

哦,我想我应该补充一下,我正在尝试编辑的列是一个外键,如果这有任何改变的话。

提前致谢, 艾莉

【问题讨论】:

    标签: sql-server-2008 default-value alter-table


    【解决方案1】:
    -- ============================ 
    -- Create default constraint
    -- ============================ 
    
    ALTER TABLE <schema_name, sysname, dbo>.<table_name, sysname, table_name>
       ADD CONSTRAINT df_<column_name, sysname, column_name>
       DEFAULT <default_expression, sysname, 0>
       FOR <column_name, sysname, column_name>
    GO
    

    如果需要添加外键

    ALTER TABLE Products WITH CHECK 
    ADD CONSTRAINT [FK_Prod_Man] FOREIGN KEY(ManufacturerID)
    REFERENCES Manufacturers (ID);
    

    【讨论】:

    • 效果很好!非常感谢!我会在大约 6 分钟后接受你的回答,当它最终让我接受时。
    • 我同意 语法——但这是一种晦涩难懂的高级语法,对于(可能)较新的数据库用户,确实需要一两个字的解释。
    • ...@HerNameIsEllie 显然不是(看到我的回复是正确的),但即便如此。
    • 我可能是一个新的数据库用户,但我并不慢。我以前从没见过这种写东西的方式,但我明白了。 :)
    【解决方案2】:

    只需提供一种方法(应@Romii 的要求)来检查是否已经为列定义了默认值,使用目录视图而不是向后兼容视图。

    IF NOT EXISTS
    (
      SELECT 1 FROM sys.default_constraints AS dc
        INNER JOIN sys.columns AS c
        ON dc.parent_object_id = c.[object_id]
        AND dc.parent_column_id = c.column_id
        WHERE dc.parent_object_id = OBJECT_ID('dbo.TableName')
        AND c.name = 'ColumnName'
    )
    BEGIN
      ALTER TABLE dbo.TableName
        ADD CONSTRAINT DF_TableName_ColumnName
        DEFAULT 'whatever' FOR ColumnName;
    END
    

    【讨论】:

      【解决方案3】:

      要向现有列添加默认约束,您可以像这样使用ALTER TABLE 命令:

      ALTER TABLE <TableName>
       add constraint <ConstraintName>
        default <DefaultValue> for <TargetColumn>
      

      一个例子:

      ALTER TABLE Pages
       add constraint DF_Pages__Link
        default 'asdf' for Link
      

      (我对默认约束的命名约定是DF_ + tablename + __ + column name

      【讨论】:

        【解决方案4】:

        使用以下查询检查是否已经在该表的列上定义了默认约束。

        SELECT d.definition ,c.name,d.name
        FROM sys.default_constraints AS d
        INNER JOIN sys.columns AS c
        ON d.parent_column_id = c.column_id
        WHERE d.parent_object_id = OBJECT_ID(N'[dbo].[TableName]', N'U')
        AND c.name = 'ColumnName';
        

        在表的列上添加默认约束的语法。

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

        示例查询:

        ALTER TABLE TABLE_NAME
        ADD CONSTRAINT DF_TABLENAME_ColumnName
        DEFAULT 1234 FOR ColumnName;
        

        【讨论】:

        • 请使用目录视图(sys.tables、sys.columns、sys.default_constraints)... sysobjects 和 syscolumns 是向后兼容视图,只能在 SQL Server 2000 中使用。
        • 默认约束在sys.default_constraints 中定义,它们指向sys.columns...我添加了一个答案来说明这一点。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-08-17
        • 2015-10-16
        • 1970-01-01
        • 1970-01-01
        • 2014-10-24
        • 1970-01-01
        • 2010-09-10
        相关资源
        最近更新 更多