代码之家  ›  专栏  ›  技术社区  ›  Joannes Vermorel Jonathan McIntire

如何删除SQL Server表列表,忽略约束?

  •  13
  • Joannes Vermorel Jonathan McIntire  · 技术社区  · 15 年前

    我有一个清单,其中有六个MSSQL 2008表,我想立即从我的数据库中删除。数据已完全迁移到新表中。中没有引用 新的 桌子到 古老的 桌子。

    问题是旧表附带了大量由工具(实际上是aspnet_regsql)自动生成的内部fk约束。因此,手动删除所有约束是一个真正的痛苦。

    如何删除忽略所有内部约束的旧表?

    6 回复  |  直到 8 年前
        1
  •  6
  •   Stephen Turner    11 年前

    这取决于你想怎样放下桌子。如果需要删除表列表,则数据库下的表覆盖率几乎超过20%。

    然后,我将在脚本下禁用该数据库中的所有约束,并删除表并在同一脚本下启用约束。

    --To Disable a Constraint at DB level
    
    EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
    
    --Write the code to DROP tables
    
    DROP TABLE TABLENAME
    
    DROP TABLE TABLENAME
    
    DROP TABLE TABLENAME
    
    --To Enable a Constraint at DB level
    
    EXEC sp_MSForEachTable 'ALTER TABLE ? CHECK CONSTRAINT ALL'
    

    最后,要检查约束的状态,请启动此查询。

    --Checks the Status of Constraints
    
    SELECT (CASE 
        WHEN OBJECTPROPERTY(CONSTID, 'CNSTISDISABLED') = 0 THEN 'ENABLED'
        ELSE 'DISABLED'
        END) AS STATUS,
        OBJECT_NAME(CONSTID) AS CONSTRAINT_NAME,
        OBJECT_NAME(FKEYID) AS TABLE_NAME,
        COL_NAME(FKEYID, FKEY) AS COLUMN_NAME,
        OBJECT_NAME(RKEYID) AS REFERENCED_TABLE_NAME,
        COL_NAME(RKEYID, RKEY) AS REFERENCED_COLUMN_NAME
    FROM SYSFOREIGNKEYS
    ORDER BY TABLE_NAME, CONSTRAINT_NAME,REFERENCED_TABLE_NAME, KEYNO
    

    如果不想在数据库级别禁用约束,请列出要删除的表。

    步骤1:检查与thos表关联的约束

    SELECT * 
    FROM sys.foreign_keys
    WHERE referenced_object_id = object_id('dbo.Tablename')
    

    步骤2:禁用与这些表关联的约束。

    ALTER TABLE MyTable NOCHECK CONSTRAINT MyConstraint
    

    第三步:放下桌子

    DROP TABLE TABLENAME
    
        2
  •  3
  •   gbn    15 年前

    简单的 DROP TABLE dbo.MyTable 将忽略除外键(除非首先删除子表/引用表)之外的所有约束(和触发器),其中可能必须先删除这些约束。

    编辑:评论后:

    没有自动的方法。你必须反复检查 sys.foreign_keys 并生成一些alter table语句。

        3
  •  2
  •   Venkatesh Muniyandi    7 年前

    运行以下脚本删除当前数据库下所有表中的所有约束,然后运行drop table语句。

    DECLARE @dropAllConstraints NVARCHAR(MAX) = N'';
    
    SELECT @dropAllConstraints  += N'
    ALTER TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(parent_object_id))
        + '.' + QUOTENAME(OBJECT_NAME(parent_object_id)) + 
        ' DROP CONSTRAINT ' + QUOTENAME(name) + ';'
    FROM sys.foreign_keys;
    EXEC sp_executesql @dropAllConstraints 
    
        4
  •  1
  •   Jonathan Arkell    12 年前

    我找到了一个合理的(ish)方法,让sql编写sql来删除约束:

    select concat("alter table ", table_name, " drop ", constraint_type ," ", constraint_name, ";")
      from information_schema.table_constraints 
      where table_name like 'somefoo_%' 
            and 
            constraint_type <> "PRIMARY KEY";
    

    您将需要修改表名以满足您的需要,或者可能需要针对其他列/值进行选择。

    此外,这将选择任何非主键约束,这可能太大了。也许你需要把它设置为=?

    我不是DBA。也许有更好的方法可以做到这一点,但就我的目的而言,它已经足够有效了。

        5
  •  0
  •   Joannes Vermorel Jonathan McIntire    15 年前

    我终于找到了基于 script provided by Jason Presley . 此脚本自动删除数据库中的所有约束。添加where子句很容易,因此它只适用于相关表的集合。在那之后,删除所有表是一件简单的事情。

        6
  •  -1
  •   jeff porter ichak khoury    15 年前

    我怀疑你必须在删除forigen密钥违禁品之前对违规表执行“alter”命令。

    ALTER TABLE Orders DROP FOREIGN KEY fk_PerOrders;
    DROP TABLE Orders;
    

    当然,如果你先放下孩子的桌子,你就不会有这个问题。 (除非您有表A与表B的约束关系,表B与A的约束关系,否则您将需要更改其中一个表,例如A以删除该约束关系)

    这是行不通的,因为订单有订单行中的一个特例

    DROP TABLE Orders;
    DROP TABLE Order_lines;
    

    这样就行了

    DROP TABLE Order_lines;
    DROP TABLE Orders;