2009-02-13 20 views
11

Necesito agregar una restricción a una tabla de servidor SQL existente, pero solo si aún no existe.SQL Server: ¿Cómo agrego una restricción a una tabla existente pero solo si la restricción no existe?

Estoy creando la restricción utilizando el siguiente SQL.

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

estoy esperando que pueda añadir un poco de SQL para el inicio del SQL para comprobar la existencia de la restricción pero no tengo ni idea de cómo.

Respuesta

16

Personalmente me gustaría quitar la restricción existente y volver a crearlo - en caso de que el que está allí es de alguna manera diferente

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 se eliminarán en una versión futura. Para SQL 2005 y versiones posteriores, use sys.objects en su lugar. – mrdenny

8

le recomiendo usar la vista INFORMATION_SCHEMA.TABLE_CONSTRAINTS. Es portátil a través de diferentes motores de bases de datos:

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 

le puede proporcionar ConstraintName como quiera sin comilla simple

0

quitar la restricción por defecto y crear su propia cuenta. . ALTER TABLE nombre_tabla gota CONSTRAINT NOMBRE GO ALTER TABLE [dbo] [TABLE_NAME] Agregar restricción [DF_TABLE_NAME_COLUMN_NAME] para [COLUMN_NAME]

1

Comprobar si la restricción ya existe antes de añadir -

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
Muy

sencillo:

SI OBJECT_ID ('Schema.keyname') ES NULO

ALTER TABLE esquema.nombretabla ADD CONSTRAINT nombre de clave ...

Cuestiones relacionadas