如何检查默认值约束是否存在?

use*_*567 29 sql sql-server-2008

我正在使用SQL Server 2008.我需要找到默认值约束是否不存在然后创建它.这是我尝试过的.

IF (NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS WHERE CONSTRAINT_NAME ='MyConstraint'))
BEGIN
    ALTER TABLE [XX] ADD  CONSTRAINT [MyConstraint]  DEFAULT ((-1)) FOR [XXXX]
END
GO
Run Code Online (Sandbox Code Playgroud)

Ric*_*iwi 49

if not exists (
    select *
      from sys.all_columns c
      join sys.tables t on t.object_id = c.object_id
      join sys.schemas s on s.schema_id = t.schema_id
      join sys.default_constraints d on c.default_object_id = d.object_id
    where t.name = 'table'
      and c.name = 'column'
      and s.name = 'schema')
  ....
Run Code Online (Sandbox Code Playgroud)

  • 从SQL Server 2005开始,建议使用`sys` schema - `sys.columns`,`sys.tables`中的目录视图 - 而不是`sysobjects`等.这些将从SQL的未来版本中删除服务器 (3认同)
  • @RichardTheKiwi - 您的链接确实包含第三句“已弃用的功能不应在新应用程序中使用。” (2认同)

Dav*_*ret 24

我发现这更容易:

IF OBJECT_ID('SchemaName.MyConstraint', 'D') IS NULL
BEGIN
    -- create it here
END
Run Code Online (Sandbox Code Playgroud)

  • 这在SQL Server 2014中对我不起作用. (2认同)
  • 即使认为我的默认约束肯定存在,`OBJECT_ID` 也会为其返回 null。 (2认同)

Jer*_*dge 6

我有点不明白为什么这个简单的任务会如此复杂。就我而言,我没有约束名称——只有表名和列名。我想在尝试添加一个之前检查他们是否已经有一个默认值。

经过更多的挖掘,我想出了这个:

IF (SELECT Column_Default FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'MY_TABLE' AND COLUMN_NAME = 'MY_COLUMN') is NULL
BEGIN
    ALTER TABLE [dbo].[MY_TABLE]
    ADD DEFAULT ('') FOR [MY_COLUMN]
END
GO
Run Code Online (Sandbox Code Playgroud)

我必须在一个巨大的样板脚本中实现它,所以越短越好。