--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:检查与这些表关联的约束
SELECT *
FROM sys.foreign_keys
WHERE referenced_object_id = object_id('dbo.Tablename')
步骤2:禁用与这些表关联的约束。
ALTER TABLE MyTable NOCHECK CONSTRAINT MyConstraint
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";
7条答案
按热度按时间rqcrx0a61#
这取决于你想如何删除表。如果表列表需要删除覆盖几乎超过20%的表在您的数据库。
然后,我将在我的脚本下禁用该DB中的所有约束,并在同一脚本下删除表和Enable约束。
最后,检查约束的状态,启动此查询。
如果不想在数据库级别禁用约束,请列出要删除的表。
步骤1:检查与这些表关联的约束
步骤2:禁用与这些表关联的约束。
步骤3:删除表
nimxete22#
一个简单的
DROP TABLE dbo.MyTable
将忽略所有的约束(和触发器),除了外键(除非您先删除子表/引用表),您可能必须先删除这些。编辑:评论后:
没有自动的方法,您必须迭代
sys.foreign_keys
并生成一些ALTER TABLE语句。qpgpyjmq3#
运行以下脚本删除当前DB下所有表中的所有约束,然后运行drop table语句。
ymdaylpp4#
我找到了一个合理的方法,让SQL编写SQL来删除约束:
您可能需要修改表名以满足自己的需要,或者可能需要根据其他列/值进行选择。
而且,这将选择任何非主键约束,这可能是一个太大的大锤。也许你需要只是设置为=?
我不是DBA。可能有更好的方法来做到这一点,但它对我的目的来说已经足够好了。
aurhwmvo5#
我终于找到了基于script provided by Jason Presley的解决方案。这个脚本自动删除DB中的所有约束。添加WHERE子句很容易,这样它就只应用于相关的表集。之后,删除所有表就很简单了。
jei2mxaa6#
使用下面的脚本时要非常小心,数据库中的所有表、视图、函数、存储过程和用户定义的类型都要忽略所有约束。
vaj7vani7#
我猜想您必须在删除之前对有问题的表执行“alter”命令,以删除forigen键约束。
当然,如果您先删除子表,那么就不会有这个问题。(除非您有表A对表B的约束,以及表B对表A的约束,那么您将需要修改其中一个表,例如A以删除约束)
例如,此WONT工作,因为订单具有来自Order_Lines的约束
这将起作用