我可以使用以下代码删除表,但不知道如何使用约束执行相同的操作:
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
James L.. 304
Eric Isaacs的答案提供了更简单的解决方案.但是,它会在任何表上找到约束.如果要在特定表上定位外键约束,请使用:
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]
如果您正在使用EF生成的外键在你需要把括号中的名字,像这样[DBO]名点.[FK_dbo.MyTable_Etc] (2认同)
小智.. 297
这比目前提出的解决方案简单得多:
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.
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
看来,如果约束不在dbo架构中,那么您还需要包含架构名称.例如:OBJECT_ID('MySchema.FK_MyConstraint','F') (10认同)
自由添加链接和类型列表. (2认同)
Jovan MSFT.. 27
在SQL Server 2016中,您可以使用DROP IF EXISTS:
CREATE TABLE t(id int primary key, parentid int constraint tpartnt foreign key references t(id)) GO ALTER TABLE t DROP CONSTRAINT IF EXISTS tpartnt GO DROP TABLE IF EXISTS t
请参阅http://blogs.msdn.com/b/sqlserverstorageengine/archive/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016.aspx
Eric Isaacs的答案提供了更简单的解决方案.但是,它会在任何表上找到约束.如果要在特定表上定位外键约束,请使用:
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]
这比目前提出的解决方案简单得多:
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.
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
在SQL Server 2016中,您可以使用DROP IF EXISTS:
CREATE TABLE t(id int primary key, parentid int constraint tpartnt foreign key references t(id)) GO ALTER TABLE t DROP CONSTRAINT IF EXISTS tpartnt GO DROP TABLE IF EXISTS t
请参阅http://blogs.msdn.com/b/sqlserverstorageengine/archive/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016.aspx
IF (OBJECT_ID('DF_Constraint') IS NOT NULL) BEGIN ALTER TABLE [dbo].[tableName] DROP CONSTRAINT DF_Constraint END
如果您知道实际约束的名称,James的答案就可以了.棘手的是,在遗留和其他现实世界的场景中,您可能不知道约束的内容.
如果是这种情况,则存在创建重复约束的风险,以避免您可以使用:
create function fnGetForeignKeyName ( @ParentTableName nvarchar(255), @ParentColumnName nvarchar(255), @ReferencedTableName nvarchar(255), @ReferencedColumnName nvarchar(255) ) returns nvarchar(255) as begin declare @name nvarchar(255) select @name = fk.name from sys.foreign_key_columns fc join sys.columns pc on pc.column_id = parent_column_id and parent_object_id = pc.object_id join sys.columns rc on rc.column_id = referenced_column_id and referenced_object_id = rc.object_id join sys.objects po on po.object_id = pc.object_id join sys.objects ro on ro.object_id = rc.object_id join sys.foreign_keys fk on fk.object_id = fc.constraint_object_id where po.object_id = object_id(@ParentTableName) and ro.object_id = object_id(@ReferencedTableName) and pc.name = @ParentColumnName and rc.name = @ReferencedColumnName return @name end go declare @name nvarchar(255) declare @sql nvarchar(4000) -- hunt for the constraint name on 'Badges.BadgeReasonTypeId' table refs the 'BadgeReasonTypes.Id' select @name = dbo.fnGetForeignKeyName('dbo.Badges', 'BadgeReasonTypeId', 'dbo.BadgeReasonTypes', 'Id') -- if we find it, the name will not be null if @name is not null begin set @sql = 'alter table Badges drop constraint ' + replace(@name,']', ']]') exec (@sql) end
ALTER TABLE [dbo].[TableName] DROP CONSTRAINT FK_TableName_TableName2