如何在Sql Server 2000中删除表上的所有外键约束?

16

如何使用T-SQL在SQL Server 2000上删除表中的所有外键约束?

3个回答

14

如果只是禁用约束条件的话,你可以使用以下代码:

ALTER TABLE myTable NOCHECK CONSTRAINT all

然后你只需使用以下方法重新打开它们:

ALTER TABLE myTable WITH CHECK CHECK CONSTRAINT all

如果您想在所有表中禁用约束,则可以使用以下方法:

-- disable all constraints
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

-- enable all constraints
exec sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"

问题的更多内容请参见:Can foreign key constraints be temporarily disabled using TSQL?

但是,如果您需要永久删除约束,则可以使用此脚本发布在databasejurnal.com上。只需稍微修改一下即可仅删除外键。

create proc sp_drop_fk_constraints
    @tablename  sysname
as
-- credit to: douglas bass

set nocount on

declare @constname  sysname,
    @cmd        varchar(1024)

declare curs_constraints cursor for
    select  name
    from    sysobjects 
    where   xtype in ('F')
    and (status & 64) = 0
    and     parent_obj = object_id(@tablename)

open curs_constraints

fetch next from curs_constraints into @constname
while (@@fetch_status = 0)
begin
    select @cmd = 'ALTER TABLE ' + @tablename + ' DROP CONSTRAINT ' + @constname
    exec(@cmd)
    fetch next from curs_constraints into @constname
end

close curs_constraints
deallocate curs_constraints

return 0

1
你也可以使用这个语句...SELECT 'ALTER TABLE ' + OBJECT_SCHEMA_NAME(parent_object_id) + '.' + OBJECT_NAME(parent_object_id) + ' DROP CONSTRAINT ' + [name] FROM sys.foreign_keys WHERE OBJECT_SCHEMA_NAME(referenced_object_id) = 'dbo' AND OBJECT_NAME(referenced_object_id) = '' - Avishek
4

给你:(未经SQL2000测试,但应该没有问题)

生成“禁用”:

SELECT  'IF EXISTS (SELECT * FROM sys.foreign_keys 
   WHERE object_id = OBJECT_ID(N''[dbo].' + FK +''') 
   AND parent_object_id = OBJECT_ID(N''[dbo].' + PT + ''')) 
   ALTER TABLE ' + PT + ' NOCHECK CONSTRAINT ' + FK + ';'
FROM 
(SELECT 
    OBJECT_NAME(constraint_object_id) as FK,
    OBJECT_NAME(parent_object_id) as PT
    FROM [sys].[foreign_key_columns] ) T
ORDER BY FK

生成“启用”:
SELECT  'ALTER TABLE ' + PT + ' WITH CHECK CHECK CONSTRAINT ' + FK + ';'
FROM 
(SELECT 
    OBJECT_NAME(constraint_object_id) as FK,
    OBJECT_NAME(parent_object_id) as PT
    FROM [sys].[foreign_key_columns] ) T
ORDER BY FK

更新:糟糕,我以为你要所有表格都用它 :) 你只需修改上面的单个表格即可。

1
系统表在SQL Server 2000中名称相似但不同:http://msdn.microsoft.com/en-us/library/aa260604%28v=SQL.80%29.aspx - Emyr

2
我认为你会发现在SQL Server 2000中没有简单的方法来删除表上的约束。尽管如此,有很多人编写了脚本来识别、删除/禁用/重新创建外键约束。其中一个例子可以在http://www.mssqltips.com/tip.asp?tip=1376找到 - 但我没有在SQL Server 2000上测试过它。
编辑:这里是另一个示例,可以为您生成删除/创建脚本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接