【问题标题】:Force drop mysql bypassing foreign key constraint绕过外键约束强制删除mysql
【发布时间】:2011-01-19 00:20:27
【问题描述】:

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

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

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

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

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

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

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

想法?

【问题讨论】:

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

标签: mysql foreign-keys sql-drop


【解决方案1】:

这可能对从搜索结果到这里的人有用。 确保您尝试删除 table 而不是 view

SET foreign_key_checks = 0; -- 删除表 丢表... -- 删除视图 下降视图... SET foreign_key_checks = 1;

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

【讨论】:

  • 这是一个更好的正确答案。解决删除所有表或仅删除几个表的问题。太棒了!
  • @PAT 非常感谢,它成功了。虽然它不能在 Mysql 查询浏览器中工作。你拯救了我的一天。
  • 工作得很好,我用这个是因为我不能删除整个数据库
  • 我同意这通常是正确的解决方案,但提出这个问题的@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/…
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 这是四年前发布的最高投票答案的副本。
    【解决方案4】:

    Drop 数据库存在于所有版本的 MySQL 中。但是如果要保持表结构,这里有个思路

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

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

    然后,登录mysql并

    源转储.sql;

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

        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 数据。

        【讨论】:

          【解决方案7】:

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

          【讨论】:

          • 哦,天哪,我现在感觉很愚蠢,我用数据库的实际名称代替了 DATABASE 这个词,而不是事后添加,谢谢+1
          • 这不是答案
          • 这是问题的正确答案,我个人不理解否决票,OP 想删除数据库,不知道如何创建替代方案。这个答案实际上回答了他试图修复的 OP 的原始问题。 OP 接受了这个答案这一事实强调了这一点。
          • @RobertPounder 这正是我的目标,自从我加入这个网站以来一直如此。我很欣赏你的观点。
          • @RobertPounder SO 不仅仅是帮助 OP,它相当于一个可搜索的“操作方法”资源,我进入这个主题是因为我需要禁用外键约束检查,而 Google 引导我这里。我很高兴删除数据库对于 OP 来说是一个很好的解决方法,但下面的答案实际上对于“强制删除 mysql 绕过外键约束”这个问题是正确的。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-24
          • 1970-01-01
          • 1970-01-01
          • 2019-09-29
          • 2014-04-01
          • 2012-04-12
          相关资源
          最近更新 更多