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

时间:2009-11-12 08:33:15

标签: sql sql-server sql-server-2008 sql-drop

我有一个包含6个MSSQL 2008表的列表,我想从我的数据库中一次删除。数据已完全迁移到新表。 new 表中没有对表的引用。

问题在于旧表带有大量内部FK约束,这些约束已由工具自动生成(实际上是aspnet_regsql)。因此,手动删除所有约束是一种真正的痛苦。

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

6 个答案:

答案 0 :(得分:6)

这取决于你想要删除表的方式。如果表格列表需要覆盖几乎超过数据库下表格的20%。

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

--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

第3步:删除表格

DROP TABLE TABLENAME

答案 1 :(得分:3)

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

编辑:评论后:

没有自动方式。您将不得不遍历sys.foreign_keys并生成一些ALTER TABLE语句。

答案 2 :(得分:2)

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

/quiz

答案 3 :(得分:1)

通过让SQL编写SQL来删除约束,我找到了一种合理的(ish)方法:

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。可能有更好的方法来做到这一点,但它对我的目的来说已经足够好了。

答案 4 :(得分:0)

我终于找到了基于script provided by Jason Presley的解决方案。此脚本自动删除数据库中的所有约束。添加WHERE子句很容易,因此它只适用于有关表的集合。之后,删除所有表格很简单。

答案 5 :(得分:-1)

我怀疑你必须在删除之前对违规表执行'alter'命令才能删除forigen键约束。

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

当然,如果你先丢弃子表,那么你就不会遇到这个问题。 (除非你有表A的表A和表B约束到A,否则你需要改变其中一个表,例如A来删除约束)

e.g。这个WONT工作,因为Orders有一个来自Order_Lines

的约束
DROP TABLE Orders;
DROP TABLE Order_lines;

e.g。这将有效

DROP TABLE Order_lines;
DROP TABLE Orders;