代码之家  ›  专栏  ›  技术社区  ›  jmatthias

SQL Server:如何向现有表添加约束,但仅当约束不存在时才添加?

  •  12
  • jmatthias  · 技术社区  · 16 年前

    我需要向现有的SQL Server表添加一个约束,但前提是它不存在。

    我正在使用以下SQL创建约束。

    ALTER TABLE [Foo] ADD CONSTRAINT [FK_Foo_Bar] FOREIGN KEY ([BarId]) REFERENCES [Bar] ([BarId]) ON UPDATE CASCADE ON DELETE CASCADE
    

    我希望可以在SQL的开头添加一些SQL来测试约束的存在性,但我不知道如何进行。

    6 回复  |  直到 6 年前
        1
  •  20
  •   Kristen    6 年前

    就我个人而言,我会删除现有的约束,并重新创建它——以防已经存在的约束在某种程度上有所不同。

    IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[MyFKName]') AND OBJECTPROPERTY(id, N'IsForeignKey') = 1)
        ALTER TABLE dbo.MyTableName DROP CONSTRAINT MyFKName
    GO
    ALTER TABLE dbo.MyTableName ADD CONSTRAINT [MyFKName] ...
    

    我目前使用的更现代的代码是:

    IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[MyFKName]') AND parent_object_id = OBJECT_ID(N'[dbo].[MyTableName]'))
        ALTER TABLE dbo.[MyTableName] DROP CONSTRAINT [MyFKName]
    GO
    ALTER TABLE dbo.[MyTableName] ADD CONSTRAINT [MyFKName] FOREIGN KEY ...
    

    不确定检查sys.objects是否有任何优势…或系统外键…但在某个时候,我决定使用sys.foreign\u键

    从sql2016开始,添加了新的“if exists”语法,其可读性更高:

    -- For SQL2016 onwards:
    ALTER TABLE dbo.[MyTableName] DROP CONSTRAINT IF EXISTS [MyFKName]
    GO
    ALTER TABLE dbo.[MyTableName] ADD CONSTRAINT [MyFKName] FOREIGN KEY ...
    
        2
  •  8
  •   Philipp M    12 年前

    我建议使用information_schema.table_constraints视图。它可以跨不同的数据库引擎进行移植:

    SELECT COUNT(*) 
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
    WHERE TABLE_NAME='Foo' 
    AND CONSTRAINT_NAME='FK_Foo_Bar' 
    AND CONSTRAINT_TYPE='FOREIGN KEY'
    
        3
  •  1
  •   Atty    8 年前

    添加约束前检查约束是否已存在-

        IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS WHERE CONSTRAINT_NAME = 'FK_Foo_Bar')
        BEGIN
        ALTER TABLE dbo.MyTableName ADD CONSTRAINT [MyFKName] ...
        END
    
        4
  •  1
  •   Martin B    7 年前

    非常简单:

    如果对象“id(‘schema.keyname’)为空

    更改表schema.tablename添加约束keyname…

        5
  •  0
  •   fancyPants    12 年前
    Alter table tableName add constraint constraintname default 0  for columnname
    

    可以根据需要提供constraintname,而不需要单引号

        6
  •  0
  •   Krishna MZP    10 年前

    删除默认约束并创建自己的约束。更改表的表名删除约束名 去 更改表[dbo]。[table_name]为[column_name]添加约束[df_table_name_column_name]