SQL Server:如何向现有表添加约束,但仅限于约束尚不存在?

时间:2009-02-13 18:16:31

标签: sql-server sql-server-2005

我需要为现有SQL服务器表添加约束,但前提是它尚不存在。

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

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

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

6 个答案:

答案 0 :(得分:20)

就个人而言,我会删除现有的约束,并重新创建它 - 以防已存在的约束以某种方式不同

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_keys是否有任何优势......但在某些时候我决定使用sys.foreign_keys

从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 ...

答案 1 :(得分:8)

我建议使用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'

答案 2 :(得分:1)

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

    IF NOT EXISTS(SELECT * FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS WHERE CONSTRAINT_NAME = 'FK_Foo_Bar')
    BEGIN
    ALTER TABLE dbo.MyTableName ADD CONSTRAINT [MyFKName] ...
    END

答案 3 :(得分:1)

很简单:

如果OBJECT_ID(' Schema.keyname')为空

ALTER TABLE Schema.tablename ADD CONSTRAINT keyname ...

答案 4 :(得分:0)

Alter table tableName add constraint constraintname default 0  for columnname

您可以根据需要提供约束名称而无需单引号

答案 5 :(得分:0)

删除默认约束并创建自己的约束。 ALTER表TABLE_NAME删除约束CONSTRAINT NAME 走 ALTER TABLE [dbo]。[TABLE_NAME] [COLUMN_NAME]的ADD CONSTRAINT [DF_TABLE_NAME_COLUMN_NAME]