2009-02-13 58 views
11

我需要添加一個約束到現有的SQL服務器表,但只有當它不存在。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來測試約束的存在的開頭,但我不知道怎麼樣。

回答

16

個人而言,我會放棄現有的約束,並重建 - 在情況下,一個是有某種方式不同

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] ... 
+3

dbo.sysobjects將在未來版本中刪除。對於SQL 2005和更高版本使用sys.objects。 – mrdenny 2009-03-09 08:52:34

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' 
0
Alter table tableName add constraint constraintname default 0 for columnname 

您可以提供constraintname,你想不單引號

0

刪除默認的約束和創建自己的。 。ALTER TABLE TABLE_NAME降約束約束名 GO ALTER TABLE [DBO] [TABLE_NAME]添加它之前添加約束[DF_TABLE_NAME_COLUMN_NAME]爲[COLUMN_NAME]

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 
0

非常簡單:

IF OBJECT_ID( 'Schema.keyname')IS NULL

ALTER TABLE Schema.tablename添加約束鍵名...