错误“无法添加外键约束”而未尝试创建外键

时间:2019-07-22 14:24:51

标签: mysql

我有这个查询:

move

其中显然不包含外键声明。因此,我在网上找到的所有答案都不适合我。发生此错误的原因一定与MySQL缓存问题有关。因为该表以前存在,所以我删除了它。因此,将create table命令中的表名重命名为CREATE TABLE `team` ( `id` int(11) NOT NULL ); /* SQL Error (1215): Cannot add foreign key constraint */ 即可创建表。

我的问题是,mysql在哪里存储此缓存以及如何删除它。在teams中找不到。在information_schema中,该表不再列出。

更新1

在删除表information_schema.INNODB_TABLES之前,该表是使用外键创建的,

team

但是现在,仅第一个(非常简单的)查询就会发生错误。

更新2

我尝试了

CREATE TABLE `team` (
  `id` int(11) NOT NULL,
  `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `is_verified` tinyint(1) NOT NULL,
  `uuid` char(36) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '(DC2Type:guid)',
  `foreign_uuid` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

ALTER TABLE `team`
  ADD PRIMARY KEY (`id`),
  ADD UNIQUE KEY `UNIQ_C4E0A61FD17F50A6` (`uuid`);

无济于事。

更新3

重启mysql服务后,错误更具体地变为:

mysql> FLUSH LOGS;
mysql> RESET MASTER;

1 个答案:

答案 0 :(得分:0)

禁用foreign_key_checks时,它可以使您执行所有操作,尤其是

  

将foreign_key_checks设置为0也会影响数据定义语句:[...] DROP TABLE删除具有其他表引用的外键的表。

这就是您(或您可以责怪的人)所做的。

重新创建表时,需要确保引用的约束在技术上有效(即使禁用foreign_key_checks也是如此):

  

重新创建被删除的表时,如果表定义不符合引用该表的外键约束,则会返回错误。

您得到的确切错误在某种程度上取决于您使用的版本,对于MySQL 5.5,它将是Error Code: 1005. Can't create table 'tablename' (errno: 150),因为MySQL 5.6,错误消息是

  

SQL错误(1215):无法添加外键约束

所以这里的问题是另一个表正在使用外键约束引用您的表,但是新的表定义不适合。

找到罪魁祸首的一种相当简单的方法是使用show engine innodb status,除其他事项外,它将包含LATEST FOREIGN KEY ERROR部分中的有用细节,包括外键定义和表名。另外,尤其是如果您怀疑有多个外键问题,请查看How do I see all foreign keys to a table or column?(MySQL存储该信息的位置,尽管它不是您可以清除的缓存)。

虽然您可以在新表中包括被引用的列,但是看起来您似乎不再打算遵守该约束,因此您可能需要删除引用的外键(或表)。