我有一个包含大量数据的表。该表中的 PK 在其他 7 个表中被引用(每个表也包含大量数据)。现在,由于主表和其他 7 个表之间从来没有任何 FK,我必须找到一种方法从主表中删除所有其他 7 个表中的任何其他行未引用的行。 这就是我的想法(所有解决方案都应使用存储过程实现):
0)“从 id 不在 (select .. table 1) 且不在 (select..table2)...table 7 的主表中删除”是不可能的,它需要很长时间才能完成。
1) 创建一个存储过程,该过程将在所有 7 个表中生成不同的、逗号分隔的已用 ID 集,并从主表中删除任何集合中不存在的那些 ID。
2) 在这 7 个表中的每一个中创建一个“限制”FK 并执行“从 main_table 中删除”。
解决方案 2 对我来说听起来最好,但我有一个问题 - 我不知道如何告诉 mysql “从主表中删除但跳过抛出 FK 异常的行”:\ 不能使用“删除忽略”,因为它会在遇到抛出 FK 错误的行时立即停止删除。
所以,我不得不问你:有没有办法让我在这 7 个表中的每一个上创建“限制”FK 并运行“从 main_table 中删除”并使用一些选项,该选项将简单地跳过任何抛出“FK”的行约束”错误?
最佳答案
您可以使用此处提供的一些资源:
How to temporarily disable a foreign key constraint in MySQL?
http://gauravsohoni.wordpress.com/2009/03/09/mysql-disable-foreign-key-checks-or-constraints/
简而言之,您可以禁用或删除外键约束:
ALTER TABLE table1 DROP FOREIGN KEY fk_name1;//摆脱当前约束
ALTER TABLE table2 DROP FOREIGN KEY fk_name2;
或
SET FOREIGN_KEY_CHECKS=0;//在你删除之前
SET FOREIGN_KEY_CHECKS=1;//在你删除之后
关于MySql忽略外键错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26014500/