首页 文章

虚假外键约束失败

提问于
浏览
109

我收到此错误消息:

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

......当我试图放 table 时:

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;

有趣的是,架构中的 I already dropped all other tables 具有针对 area 的外键 . 实际上,除了 area 表之外,数据库是空的 .

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

(我甚至可以运行 RENAME TABLE area TO something_else 命令: - ?)

9 回答

  • 47

    希望它的工作

    SET foreign_key_checks = 0; DROP TABLE table name ; SET foreign_key_checks = 1;

  • 100

    来自this blog

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

    SET FOREIGN_KEY_CHECKS=0;
    

    一旦你搞砸了,一定要恢复它们:

    SET FOREIGN_KEY_CHECKS=1;
    
  • 0

    按需,现在作为答案......

    当使用MySQL查询浏览器或phpMyAdmin时,似乎为每个查询打开了一个新连接(bugs.mysql.com/bug.php?id=8280),这使得在一个查询中编写所有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;
    

    SET FOREIGN_KEY_CHECKS=1 作为额外的安全措施......

  • 1

    在Rails上,可以使用 rails console 执行以下操作:

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

    无法删除或更新父行:外键约束失败( table1 . user_role ,CONSTRAINT FK143BF46A8dsfsfds@#5A6BD60 FOREIGN KEY( user_id )REFERENCES userid ))

    我通过两个简单的步骤做了什么 . 首先我删除子表中的子行

    mysql>从table2中删除,其中role_id = 2 && user_id = 20;

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

    第二步是删除父母

    从table1删除id = 20;

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

    通过这个我解决问题,这意味着删除孩子然后删除父

    我希望你明白了 . :)

  • 28

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

  • -1

    两种可能性:

    • 在另一个模式中有一个表(mysql术语中的"database"),它有一个FK参考

    • innodb内部数据字典与mysql不同步 .

    在丢弃失败后,您可以通过执行“SHOW ENGINE INNODB STATUS”来查看它是哪个表(无论如何) .

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

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

  • 0

    禁用外键检查

    SET FOREIGN_KEY_CHECKS=0
    
  • 121

    也许您之前使用此表时收到错误 . 您可以重命名表并尝试再次删除它 .

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

相关问题