Mysql 伪外键约束失败

Mysql 伪外键约束失败,mysql,innodb,Mysql,Innodb,我收到以下错误消息: 第40行的错误1217(23000):无法 删除或更新父行:a 外键约束失败 。。。当我试图放下桌子时: DROP TABLE IF EXISTS `area`; 。。。定义如下: CREATE TABLE `area` ( `area_id` char(3) COLLATE utf8_spanish_ci NOT NULL, `nombre_area` varchar(30) COLLATE utf8_spanish_ci NOT NULL, `descri

我收到以下错误消息:

第40行的错误1217(23000):无法 删除或更新父行:a 外键约束失败

。。。当我试图放下桌子时:

DROP TABLE IF EXISTS `area`;
。。。定义如下:

CREATE TABLE `area` (
  `area_id` char(3) COLLATE utf8_spanish_ci NOT NULL,
  `nombre_area` varchar(30) COLLATE utf8_spanish_ci NOT NULL,
  `descripcion_area` varchar(100) COLLATE utf8_spanish_ci NOT NULL,
  PRIMARY KEY (`area_id`),
  UNIQUE KEY `nombre_area_UNIQUE` (`nombre_area`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
有趣的是,我已经删除了模式中所有其他表,这些表在
区域
上有外键。实际上,除了
区域
表之外,数据库是空的

如果数据库中没有任何其他对象,它怎么可能有子行?据我所知,InnoDB不允许在其他模式上使用外键,是吗


(我甚至可以运行
将表区域重命名为其他内容
命令:-?)

禁用外键检查

SET FOREIGN_KEY_CHECKS=0
两种可能性:

  • 另一个模式(mysql术语中的“数据库”)中有一个表,该表具有FK引用
  • innodb内部数据字典与mysql不同步
  • 您可以通过在删除失败后执行“ShowEngineInnoDB状态”来查看它是哪个表(无论如何是其中的一个)

    如果是后一种情况,如果可以的话,我会转储并恢复整个服务器


    MySQL 5.1及更高版本将在错误消息中为您提供带有FK的表名。

    可能您以前使用此表时收到错误。您可以重命名该表并再次尝试删除它

    ALTER TABLE `area` RENAME TO `area2`;
    DROP TABLE IF EXISTS `area2`;
    

    随需应变,现在作为回答


    当使用MySQL查询浏览器或phpMyAdmin时,似乎会为每个查询()打开一个新连接,因此有必要在一个查询中写入所有drop语句,例如

    SET FOREIGN_KEY_CHECKS=0; 
    DROP TABLE my_first_table_to_drop; 
    DROP TABLE my_second_table_to_drop; 
    SET FOREIGN_KEY_CHECKS=1; 
    
    其中,
    设置外键检查=1
    用作额外的安全措施

    来自:

    您可以暂时禁用外键检查:

    SET FOREIGN_KEY_CHECKS=0;
    
    只要确保在你搞乱之后恢复它们:

    SET FOREIGN_KEY_CHECKS=1;
    
    希望它的工作

    设置外键检查=0; 删除表格
    表格名称

    设置外键检查=1

    在Rails上,可以使用
    Rails控制台执行以下操作:

    connection = ActiveRecord::Base.connection
    connection.execute("SET FOREIGN_KEY_CHECKS=0;")
    

    无法删除或更新父行:外键约束失败(
    table1
    user\u role
    ,约束
    FK143BF46A8dsfsfds@#5A6BD60
    外键(
    user\u id
    )引用
    user
    id

    我用了两个简单的步骤。首先,我删除子表中的子行,如

    mysql>从表2中删除,其中角色\u id=2&&user\u id=20

    查询正常,1行受影响(0.10秒)

    第二步是删除父级

    从表1中删除,其中id=20

    查询正常,1行受影响(0.12秒)

    这样我就解决了先删除子对象,再删除父对象的问题



    我希望你明白了

    我找到了一个简单的解决方案,导出数据库,在文本编辑器中编辑想要编辑的内容,然后导入。完成

    正确的命令似乎是
    SET FOREIGN\u KEY\u CHECKS=0
    ,它确实修复了错误消息。你知道为什么需要这样做吗?即使在表消失之后,外键是否仍被缓存?老实说,我不知道为什么会出现这样的问题,但请确保在每次进行重大更改或更新时禁用密钥检查。这种情况在我身上发生过好几次,让我好几天都没有睡觉。请确保
    将FOREIGN\u KEY\u CHECKS设置为1完成后!当使用MySQL查询浏览器或phpMyAdmin时,似乎为每个查询()打开了一个新连接,因此有必要在一个查询中写入所有drop语句,例如,
    SET FOREIGN\u KEY\u CHECKS=0;将表格my_第一张表格放置到DROP;放下我的桌子,放下第二张桌子;设置外键检查=1其中设置外键检查=1作为额外的安全措施…@KarlisRode,关于phpMyAdmin的评论太棒了。如果你把它作为一个答案,我会+1它。这个表可能是另一个模式中引用完整性关系的一部分吗?我有一些应用程序的其他副本,所以它总是可能的。但是,我使用的语法基本上是
    CONSTRAINT fk_servicio_area1外键(area_id)引用area(area_id)
    ,即表引用上没有架构名称:-?我无法再重现该问题。不同步字典是一个可能的原因。我将在第二天测试它,看看
    显示引擎INNODB状态的报告。谢谢您的回答!我有一个多对多表仍在引用我们无法删除的表,因此我必须先删除该表。SHOW ENGINE INNODB STATUS在“LATEST foreign key error”下列出最后一个外键错误。这有一个时间戳。可能有一个表仍然具有主题表的引用键。就我而言,就像这样,节省了很多时间。在“最新外键错误”下删除了db对于那些使用phpMyAdmin创建转储的人,有一个选项“禁用外键检查”,它将自动添加
    设置外键检查=0到转储的开头。似乎phpMyAdmin已经实现了这个可爱的功能,现在我正在等待mysqlWorkbench也这么做!:)@仅供参考,我接受了MarkR的回答,因为它为这个问题提供了一个有意义的解释,尽管我承认我无法验证它,因为我在接下来的6年里没有遇到过同样的问题,甚至一次也没有。此答案和之前的答案提供了一个变通方法(非常好),但不要真正解决问题本身,因为你只能接受我必须选择的一个答案。警告:这不是解决方案,只是懒人的变通方法。使用此选项后(其他一些表上的记录指向被删除的表),您将体验到外键悬空,这会致命地破坏数据库的一致性(in),并且应用程序将开始到处抛出异常。我已经警告过你了。虽然我相信bekce的警告应该得到理解和注意,但这个解决方案确实对我有用,因为我对这个问题很有信心