强制drop mysql绕过外键约束

Force drop mysql bypassing foreign key constraint

我试图删除数据库中的所有表,除了一个,我最终得到以下错误:

Cannot delete or update a parent row: a foreign key constraint fails

当然,我可以试错,看看那些关键约束是什么,并最终删除所有表但我想知道是否有一种快速方法强制删除所有表(因为我将能够重新插入那些我 不想删除)。

谷歌针对某些建议使用以下方法的网站:

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

简短的回答是它没有真正做到这一点,因为我最终收到了同样的错误,而我能够删除更多的表。 我已经在Stack Overflow上看到了将所有外键链接到某个表的方法,但这样做太费时了,除非我编写所有脚本(在没有其他选项的情况下这是可行的)

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

想法?


这可能对从搜索到此处结束的人有用。
确保您尝试删除表而不是视图。

1
2
3
4
5
6
SET foreign_key_checks = 0;
-- Drop tables
drop table ...
-- Drop views
drop view ...
SET foreign_key_checks = 1;

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


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

  • 选择要删除的表
  • 从表格列表底部的下拉列表中选择drop
  • 将打开一个新页面,底部有一个复选框
    "外键检查",取消选中。
  • 接受"是"确认删除。


您可以使用以下步骤,它对我有用,可以使用约束删除表,解决方案已经在上面的注释中解释过,我只是添加了屏幕截图 - enter image description here


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

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

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

然后,登录到mysql和

source dump.sql;


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

这包含了你的mysql shell中的几个步骤(虽然不是一步到位的解决方案),这对我有所帮助并节省了我的一天。

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

我遵循的步骤:

1
2
3
4
5
6
 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 shell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ 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>

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