强制删除mysql绕过外键约束


134

我试图从数据库中删除除一个以外的所有表,但最终出现以下错误:

无法删除或更新父行:外键约束失败

当然,我可以反复试验一下,看看这些关键约束是什么,最终删除所有表,但是我想知道是否有一种快速删除所有表的方法(因为我可以重新插入那些表不想删除)。

Google针对我的某个网站建议采用以下方法:

mysql> SET foreign_key_checks = 0;
mysql> drop table ...
mysql> SET foreign_key_checks = 1;

简短的答案是,它实际上并没有解决问题,因为当我能够删除更多表时,我最终收到了同样的错误。我已经在Stack Overflow上看到了将所有外键链接到某个表的方法,但是除非我全部编写脚本,否则这将非常浪费时间(在没有其他选择的情况下这是可行的)

数据库是4.1,所以我不能使用 DROP DATABASE

有想法吗?


1
您为什么选择了所选择的答案,而该答案甚至无法为您的问题提供解决方案?
桑杰

Answers:


-40

由于您不希望保留任何数据,因此删除整个数据库并创建一个新数据库


3
哦,天哪,我现在觉得很愚蠢,我用数据库的实际名称代替了DATABASE一词,而不是之后再添加,谢谢+1
johnnyArt 2010年

13
这不是答案
Freelancer 2014年

8
很高兴看到这个答案被打勾并被投票
tom10271

4
@RobertPounder正是我的目标,并且自从我加入该网站以来。感谢您的观点。
奥塔维奥·德西奥(OtávioDécio)

3
@RobertPounder SO不仅是帮助OP,它还可以搜索“如何”资源,我进入了这个主题,因为我需要禁用外键约束检查,而Google带领我来到这里。我很高兴删除数据库对于OP是一个很好的解决方法,但是下面的答案实际上对于“强制删除mysql绕过外键约束”这个问题是正确的。
Val Redchenko '17

404

这可能对某人因搜索而终止。确保您要删除表格而不是视图

SET foreign_key_checks = 0;
-放桌子
放置表...
-删除视图
放下视图...
SET foreign_key_checks = 1;

SET foreign_key_checks = 0是将外键检查设置为关闭,然后SET foreign_key_checks = 1是将外键检查重新设置为打开。关闭检查后,可以删除表,然后重新打开检查以保持表结构的完整性。


43
PAT是我的朋友!
SeanDowney 2011年

5
这是一个更好的正确答案。解决是否删除所有表或仅删除几个表的问题。了不起!
路加·史蒂文森

@PAT非常感谢,它奏效了。尽管它在Mysql Query浏览器中无法工作。你救了我的日子。
2015年

工作得很好,我用了它,因为我无法删除整个数据库
Pablo Pazos 2015年

1
我同意这通常是正确的解决方案,但提出问题的@johnnyArt特别排除了此方法的可行性,因为它对他不起作用。因此,这似乎不是原始问题的正确答案,对吗?
大卫,

18

如果您使用的是phpmyadmin,则此功能已经存在。

  • 选择要删除的表
  • 从表格列表底部的下拉菜单中,选择下拉菜单
  • 将打开一个新页面,其底部的复选框为“ Foreign key check”,请取消选中该复选框。
  • 接受“是”确认删除。

3
你救了我的一天!谢谢!像魅力一样工作!
卡米

4

您可以使用以下步骤,它对我来说可以删除带有约束的表,以上注释中已经说明了解决方案,我为此添加了屏幕截图-在此处输入图片说明


这是四年前发布的投票最高的答案的副本。
CHB

3

Drop数据库存在于所有版本的MySQL中。但是,如果要保留表结构,这是一个想法

mysqldump --no-data --add-drop-database --add-drop-table -hHOSTNAME -uUSERNAME -p> dump.sql

这是一个程序,不是mysql命令

然后,登录到mysql和

源dump.sql;


1

从终端一次删除所有表的简单解决方案。

这涉及到您的mysql shell内的几个步骤(尽管不是一个一步的解决方案),这使我工作并节省了时间。

适用于服务器版本:5.6.38 MySQL社区服务器(GPL)

我遵循的步骤:

 1. generate drop query using concat and group_concat.
 2. use database
 3. turn off / disable foreign key constraint check (SET FOREIGN_KEY_CHECKS = 0;), 
 4. copy the query generated from step 1
 5. re enable foreign key constraint check (SET FOREIGN_KEY_CHECKS = 1;)
 6. run show table

MySQL外壳

$ mysql -u root -p
Enter password: ****** (your mysql root password)
mysql> SYSTEM CLEAR;
mysql> SELECT CONCAT('DROP TABLE IF EXISTS `', GROUP_CONCAT(table_name SEPARATOR '`, `'), '`;') AS dropquery FROM information_schema.tables WHERE table_schema = 'emall_duplicate';
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| dropquery                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| DROP TABLE IF EXISTS `admin`, `app`, `app_meta_settings`, `commission`, `commission_history`, `coupon`, `email_templates`, `infopages`, `invoice`, `m_pc_xref`, `member`, `merchant`, `message_templates`, `mnotification`, `mshipping_address`, `notification`, `order`, `orderdetail`, `pattributes`, `pbrand`, `pcategory`, `permissions`, `pfeatures`, `pimage`, `preport`, `product`, `product_review`, `pspecification`, `ptechnical_specification`, `pwishlist`, `role_perms`, `roles`, `settings`, `test`, `testanother`, `user_perms`, `user_roles`, `users`, `wishlist`; |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> USE emall_duplicate;
Database changed
mysql> SET FOREIGN_KEY_CHECKS = 0;                                                                                                                                                   Query OK, 0 rows affected (0.00 sec)

// copy and paste generated query from step 1
mysql> DROP TABLE IF EXISTS `admin`, `app`, `app_meta_settings`, `commission`, `commission_history`, `coupon`, `email_templates`, `infopages`, `invoice`, `m_pc_xref`, `member`, `merchant`, `message_templates`, `mnotification`, `mshipping_address`, `notification`, `order`, `orderdetail`, `pattributes`, `pbrand`, `pcategory`, `permissions`, `pfeatures`, `pimage`, `preport`, `product`, `product_review`, `pspecification`, `ptechnical_specification`, `pwishlist`, `role_perms`, `roles`, `settings`, `test`, `testanother`, `user_perms`, `user_roles`, `users`, `wishlist`;
Query OK, 0 rows affected (0.18 sec)

mysql> SET FOREIGN_KEY_CHECKS = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW tables;
Empty set (0.01 sec)

mysql> 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.