mysql设置外键 - navicat外键




虚假外键约束失败 (6)

两种可能性:

  1. 在另一个模式(mysql术语中的“数据库”)中有一个表,它具有FK引用
  2. innodb内部数据字典与mysql不同步。

您可以通过在放置失败后执行“SHOW ENGINE INNODB STATUS”来查看它是哪个表(它们中的一个,无论如何)。

如果事实证明是后者,我会转储并恢复整个服务器,如果可以的话。

MySQL 5.1及更高版本会在错误信息中为您提供FK表的名称。

我收到此错误消息:

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

...当我尝试放下一张桌子时:

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;

有趣的是, 我已经放弃了架构中具有外键的所有其他表 。 实际上,除了area表之外,数据库是空的。

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

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


也许您在使用此表之前收到错误。 您可以重命名该表并尝试再次将其删除。

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

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

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

希望它的工作

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


按要求,现在作为答案...

当使用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作为额外的安全措施...


无法删除或更新父行:外键约束失败( [email protected]#5A6BD60 ,CONSTRAINT [email protected]#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秒)

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

我希望你明白了。 :)







innodb