【问题标题】:How to disable Constraints for all the tables and enable it?如何禁用所有表的约束并启用它?
【发布时间】:2013-02-20 05:21:09
【问题描述】:

我有 60 张桌子。我想删除 10 个表,其中这 10 个表是约束(PK,FK)到其他 20 个表。在删除这 10 个表时,我需要从其他 20 个表中截断或删除数据。最后,我想禁用所有 60 个表约束(FK,PK),然后在完成添加/删除表的工作后启用所有 60 个表约束。这可能吗?

当我放下一张桌子时,它要求 FK。当我截断那些 FK 依赖项时,它仍然显示相同。我不想惹那些FK,PK。

我想知道更聪明的方法。

【问题讨论】:

    标签: sql-server sql-server-2008 foreign-keys constraints foreign-key-relationship


    【解决方案1】:
    EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"
    GO
    

    您可能还想这样做:

    EXEC sp_MSforeachtable @command1="ALTER TABLE ? DISABLE TRIGGER ALL"
    GO
    

    之后启用它们

    EXEC sp_MSforeachtable @command1="ALTER TABLE ? ENABLE TRIGGER ALL"
    GO
    
    -- SQL enable all constraints - enable all constraints sql server
    -- sp_MSforeachtable is an undocumented system stored procedure
    EXEC sp_MSforeachtable @command1="ALTER TABLE ? CHECK CONSTRAINT ALL"
    GO
    

    编辑:
    如果禁用约束还不够,您将不得不放弃约束。

    如果您要删除并重新创建表,则必须在之后重新创建外键约束。

    如果您只需要取消约束,您可能会发现这很有用:
    SQL DROP TABLE foreign key constraint

    如果您需要编写脚本来删除和创建约束,您可能会发现我的帖子更有用:
    SQL Server: Howto get foreign key reference from information_schema?

    【讨论】:

    • 我试图禁用和删除表,但该表没有被删除并说被 FK 约束引用..,
    • @Pink 您在重新启用CONSTRAINTs 之前尝试过DROP 语句?
    • 我有禁用约束和 DROP 表,禁用后它必须正确删除,但它再次显示“无法删除对象 'DropTable',因为它被外键约束引用。”
    • @Out: 啊,你也有引用其他表上的表的键。将它们移到您要丢弃的桌子上是不够的。你不能删除表或以其他方式孤立数据是外键的想法。
    【解决方案2】:

    要禁用你可以应用这个:

    EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
    

    启用:

    EXEC sp_msforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
    

    【讨论】:

      【解决方案3】:
      declare @tname varchar(128), @tschema varchar(128);
      
      declare tables cursor for
      select TABLE_SCHEMA, TABLE_NAME
      from INFORMATION_SCHEMA.TABLES;
      
      open tables;
      
      fetch next from tables
          into @tschema, @tname;
      
      while @@FETCH_STATUS = 0
      begin
          execute ('alter table [' + @tschema + '].[' + @tname + '] nocheck constraint all');
          fetch next from tables
              into @tschema, @tname;
      end;
      
      close tables;
      
      deallocate tables;
      

      【讨论】:

      • 只需将“nocheck constraint all”更改为“check constraint all”即可对所有表启用约束。
      • 当我执行这些查询时它是成功的,但是当我尝试删除表时它仍然无法删除,因为 FK 约束。我的目标是删除几个没有 FK 错误的表,只需禁用 FK 并删除表
      • 我将“where schemaTables.TABLE_TYPE = 'BASE TABLE'”添加到查询中以仅获取表,它对我有用。
      【解决方案4】:

      尝试使用这个命令

      ALTER TABLE table_Name NOCHECK CONSTRAINT all
      

      为您的表禁用所有约束,并为所有 10 个表执行此操作,但在此之前检查您是否没有在您的表上放置任何 Delete_Cascade,因为显示的错误也可能是由于 sub_tables 依赖关系。如果它不起作用,请尝试通过此命令禁用特定约束,可能是两个或三个额外的依赖项。

      ALTER TABLE tableName NOCHECK CONSTRAINT constraintName
      

      【讨论】:

        猜你喜欢
        • 2014-02-16
        • 2010-09-12
        • 1970-01-01
        • 2015-05-23
        • 2010-11-07
        • 2012-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多