ChatGPT解决这个技术问题 Extra ChatGPT

绕过外键约束强制删除mysql

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

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

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

谷歌将我瞄准了一些建议以下方法的网站:

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

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

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

想法?

为什么您选择的答案甚至没有为您的问题提供解决方案?

R
Robert Pounder

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

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


这是一个更好的正确答案。解决删除所有表或仅删除几个表的问题。了不起!
@PAT 非常感谢,它奏效了。虽然它不能在 Mysql Query 浏览器中工作。你拯救了我的一天。
工作得很好,我用这个是因为我不能删除整个数据库
我同意这通常是正确的解决方案,但是提出这个问题的@johnnyArt 明确排除了这是一个可行的选择,因为它对他不起作用。所以这似乎不是原始问题的正确答案,是吗?
这个答案是恰当的,正确的,并帮助我解决了我的挫败感,但是,重要的是要注意有两个 foreign_key_checks 变量:一个全局变量和一个本地(每个会话)变量。命令 SET foreign_key_checks 修改会话变量,而 SET GLOBAL foreign_key_checks 修改全局变量。或者,您可以使用 ALTER TABLE table_name DISABLE KEYS 临时禁用 FK。使用 ALTER TABLE table_name ENABLE KEYS - tableplus.com/blog/2018/08/… 重新启用它
A
Ali Azhar

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

选择要删除的表

从表格列表底部的下拉列表中,选择 drop

将打开一个新页面,底部有“外键检查”复选框,取消选中它。

接受“是”确认删除。


s
srinivas

https://i.stack.imgur.com/7xXAJ.jpg


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

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

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

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

然后,登录mysql并

源转储.sql;


S
Sanjay

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

这涉及到您的 mysql shell 中的几个步骤(虽然不是一步解决方案),这对我有用并节省了我的一天。

适用于服务器版本:5.6.38 MySQL Community Server (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> 

S
SAR

Table1 {T_Id, T_Name, TT_Id(Nullable)(Table2上的外键到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 数据。


O
Otávio Décio

由于您对保留任何数据不感兴趣,drop the entire database 并创建一个新数据。


哦,天哪,我现在觉得很愚蠢,我用数据库的实际名称代替了 DATABASE 这个词,而不是事后添加,谢谢+1
这不是答案
这是问题的正确答案,我个人不理解否决票,OP 想删除数据库,不知道如何创建替代方案。这个答案实际上回答了他试图修复的 OP 的原始问题。 OP接受了这个答案这一事实强调了这一点。
@RobertPounder 这正是我的目标,自从我加入这个网站以来就一直如此。我很欣赏你的观点。
@RobertPounder SO 不仅仅是帮助 OP,它相当于一个可搜索的“如何做”资源,我进入这个主题是因为我需要禁用外键约束检查,而谷歌把我带到了这里。我很高兴删除数据库是 OP 的一个很好的解决方法,但下面的答案实际上对于“强制删除 mysql 绕过外键约束”这个问题是正确的。