274 votes

Comment supprimer une contrainte de clé étrangère uniquement si elle existe sur le serveur SQL?

Je peux supprimer une table si elle existe en utilisant le code suivant mais je ne sais pas comment faire de même avec une contrainte:

 IF EXISTS(SELECT 1 FROM sys.objects WHERE OBJECT_ID = OBJECT_ID(N'TableName') AND type = (N'U')) DROP TABLE TableName
go
 

J'ajoute aussi la contrainte en utilisant ce code:

 ALTER TABLE [dbo].[TableName] 
  WITH CHECK ADD CONSTRAINT [FK_TableName_TableName2] FOREIGN KEY([FK_Name])
    REFERENCES [dbo].[TableName2] ([ID])
go
 

371voto

Eric Isaacs Points 561

C'est beaucoup plus simple que l'actuelle proposition de solution:

IF (OBJECT_ID('FK_ConstraintName', 'F') IS NOT NULL)
BEGIN
    ALTER TABLE dbo.TableName DROP CONSTRAINT FK_ConstraintName
END

Si vous avez besoin de déplacer un autre type de contrainte, ce sont les codes applicables à passer dans la fonction OBJECT_ID() dans le second paramètre de position:

C = CHECK constraint
D = DEFAULT (constraint or stand-alone)
F = FOREIGN KEY constraint
PK = PRIMARY KEY constraint
UQ = UNIQUE constraint

Vous pouvez également utiliser OBJECT_ID sans le deuxième paramètre.

Liste complète des types ici:

Type d'objet:

AF = Aggregate function (CLR)
C = CHECK constraint
D = DEFAULT (constraint or stand-alone)
F = FOREIGN KEY constraint
FN = SQL scalar function
FS = Assembly (CLR) scalar-function
FT = Assembly (CLR) table-valued function
IF = SQL inline table-valued function
IT = Internal table
P = SQL Stored Procedure
PC = Assembly (CLR) stored-procedure
PG = Plan guide
PK = PRIMARY KEY constraint
R = Rule (old-style, stand-alone)
RF = Replication-filter-procedure
S = System base table
SN = Synonym
SO = Sequence object

S'applique à: SQL Server 2012 à l'aide de SQL Server 2014.

SQ = Service queue
TA = Assembly (CLR) DML trigger
TF = SQL table-valued-function
TR = SQL DML trigger
TT = Table type
U = Table (user-defined)
UQ = UNIQUE constraint
V = View
X = Extended stored procedure

346voto

James L Points 6068
IF EXISTS (SELECT * 
  FROM sys.foreign_keys 
   WHERE object_id = OBJECT_ID(N'dbo.FK_TableName_TableName2')
   AND parent_object_id = OBJECT_ID(N'dbo.TableName')
)
  ALTER TABLE [dbo.TableName] DROP CONSTRAINT [FK_TableName_TableName2]

17voto

DevDave Points 2095
IF (OBJECT_ID('DF_Constraint') IS NOT NULL)
BEGIN
    ALTER TABLE [dbo].[tableName]
    DROP CONSTRAINT DF_Constraint
END

16voto

Sam Saffron Points 56236

Réponse de James fonctionne très bien si vous connaissez le nom de la contrainte réelle. La chose rusée qui est dans l’héritage et les autres scénarios du monde réel vous pouvez pas savoir ce qu’on appelle la contrainte.

Si c’est le cas que vous risquez de créer des contraintes en double, pour éviter de vous pouvez utiliser :

6voto

Mitch Wheat Points 169614
ALTER TABLE [dbo].[TableName]
    DROP CONSTRAINT FK_TableName_TableName2

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X