强制删除 mysql 绕过外键约束

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

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

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

谷歌把我定位在一个建议使用以下方法的网站上:

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

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

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

有什么想法吗?

181653 次浏览

因为您对保存任何数据都不感兴趣,所以 删除整个数据库并创建一个新的。

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

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

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

然后,登录 mysql

源 Dump.sql;

这个可能对搜寻到这里的人有用。 确保你正在尝试放弃一个 桌子而不是一个 风景

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是将外键检查设置为关闭。当检查不在表中时,可以删除检查,然后重新打开检查以保持表结构的完整性。

你可以使用下面的步骤,它的工作为我删除表与约束,解决方案已经在上面的评论中说明,我只是添加了屏幕截图-enter image description here

如果您正在使用 Phpmyadmin,那么这个特性已经存在。

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

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

这涉及到您的 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>

表1{ T _ Id,T _ Name,TT _ Id (Nullable)(表2中与列 TT _ ID 相对应的外键)}

表2{ TT _ ID,TT _ Title }

1- make the foreign Key relation null able on the table1
2- update table1 set TT_ID = null where T_ID = ?
3- delete from table1

现在可以删除 table1数据并保留 table2数据。