我有一个包含6个MSSQL 2008表的列表,我想从我的数据库中一次删除。数据已完全迁移到新表。 new 表中没有对旧表的引用。
问题在于旧表带有大量内部FK约束,这些约束已由工具自动生成(实际上是aspnet_regsql)。因此,手动删除所有约束是一种真正的痛苦。
如何忽略所有内部约束来删除旧表?
答案 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;