我可以删除一个表,如果它存在使用以下代码,但不知道如何做同样的约束:

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

我还使用以下代码添加了约束:

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

当前回答

好吧,我知道我迟到了,但是下面是我认为最好的语法。如果需要,向OBJECT_ID子句添加模式名。

IF OBJECTPROPERTY(OBJECT_ID(N'My_FK_name'),'IsConstraint') =1
ALTER TABLE dbo.TableName DROP CONSTRAINT My_FK_name

其他回答

埃里克·艾萨克斯给出了更简单的答案。但是,它可以在任何表上找到约束。如果你想在一个特定的表上指定一个外键约束,使用这个:

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

好吧,我知道我迟到了,但是下面是我认为最好的语法。如果需要,向OBJECT_ID子句添加模式名。

IF OBJECTPROPERTY(OBJECT_ID(N'My_FK_name'),'IsConstraint') =1
ALTER TABLE dbo.TableName DROP CONSTRAINT My_FK_name

这比目前提出的解决方案简单得多:

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

如果你需要删除另一种类型的约束,这些是传入OBJECT_ID()函数的第二个参数位置的适用代码:

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

也可以使用不带第二个参数的OBJECT_ID。

完整的类型列表在这里:

对象类型:

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

适用于:SQL Server 2012 ~ SQL Server 2014。

服务队列 TA =组装(CLR) DML触发器 TF = SQL表值函数 SQL DML触发器 TT =表类型 U =表(自定义) UQ = UNIQUE约束 V =视图 扩展存储过程

对于这个问题,公认的答案似乎对我不起作用。我用稍微不同的方法达到了同样的效果:

IF (select object_id from sys.foreign_keys where [name] = 'FK_TableName_TableName2') IS NOT NULL
BEGIN
    ALTER TABLE dbo.TableName DROP CONSTRAINT FK_TableName_TableName2
END