2009-02-13 8 views
11

Je dois ajouter une contrainte à une table de serveur SQL existante, mais seulement si elle n'existe pas déjà.SQL Server: comment ajouter une contrainte à une table existante mais uniquement si la contrainte n'existe pas déjà?

Je crée la contrainte en utilisant l'instruction SQL suivante.

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

J'espère que je peux ajouter un peu de SQL au début du SQL pour tester l'existence de la contrainte, mais je ne sais pas comment.

Répondre

16

Personnellement, je supprimer la contrainte existante, et le recréer - dans le cas où celui qui est là est d'une certaine façon différente

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 sera supprimé dans une prochaine version. Pour SQL 2005 et supérieur, utilisez plutôt sys.objects. – mrdenny

8

Je vous recommande d'utiliser la vue INFORMATION_SCHEMA.TABLE_CONSTRAINTS. Il est portable sur les différents moteurs de base de données:

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 

Vous pouvez fournir constraintName que vous voulez sans guillemet simple

0

Supprimez la contrainte par défaut et créez votre propre. . ALTER table nom_table drop CONSTRAINT NOM GO ALTER TABLE [dbo] [TABLE_NAME] ADD CONSTRAINT [DF_TABLE_NAME_COLUMN_NAME] POUR [COLUMN_NAME]

1

Vérifiez si la contrainte existe déjà avant de l'ajouter -

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

Très simple:

IF OBJECT_ID ('Schema.keyname') IS NULL

ALTER TABLE Schema.tablename AJOUTER CONTRAINTE keyname ...

Questions connexes