【问题标题】:How do I drop all foreign-key constraints on a table in Sql Server 2000?如何在 Sql Server 2000 中删除表上的所有外键约束?
【发布时间】:2009-09-17 12:46:45
【问题描述】:

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

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    给你:(没有在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
    

    更新:糟糕,我以为您希望所有表格都使用它 :) 您可以在上面为您的单个表格进行修改。

    【讨论】:

    【解决方案2】:

    如果这里可以选择简单地禁用约束,您可以使用:

    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?

    但如果您需要永久删除约束,您可以使用this script posted on 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
    

    【讨论】:

    • 你也可以用这个语句....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) = '<table>'
    【解决方案3】:

    我想您会发现在 SQL Server 2000 中删除表上的约束没有简单的方法。也就是说,有很多人编写了可以识别和删除/禁用/重新创建外键约束的脚本.一个例子是http://www.mssqltips.com/tip.asp?tip=1376 - 但我还没有在 SQL Server 2000 上测试过。

    编辑:这是另一个 example 为您生成删除/创建脚本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多