我试图恢复我用mysqldump创建的转储。
第63行的错误1215(HY000):无法添加外键约束
DROP TABLE IF EXISTS `channel_tags`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `channel_tags` (
`channel_tag_id` bigint(20) NOT NULL AUTO_INCREMENT,
`channel_id` bigint(20) NOT NULL,
`tag_name` varchar(60) NOT NULL,
PRIMARY KEY (`channel_tag_id`),
KEY `channel_id_idx` (`channel_id`),
KEY `tag_name_idx` (`tag_name`),
CONSTRAINT `ct_channel_fk` FOREIGN KEY (`channel_id`) REFERENCES `channel_shard` (`channel_id`),
CONSTRAINT `ct_tag_fk` FOREIGN KEY (`tag_name`) REFERENCES `tags` (`tag_name`)
) ENGINE=InnoDB AUTO_INCREMENT=833 DEFAULT CHARSET=utf8mb4;
/*!40101 SET character_set_client = @saved_cs_client */;
DROP TABLE IF EXISTS `tags`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `tags` (
`tag_name` varchar(60) NOT NULL,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
PRIMARY KEY (`tag_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
/*!40101 SET character_set_client = @saved_cs_client */;
create table语句的顺序相同。
SHOW ENGINE INNODB STATUS\G显示:
------------------------
LATEST FOREIGN KEY ERROR
------------------------
2015-12-07 17:20:16 1ac30b000 Error in foreign key constraint of table sde/channel_tags:
FOREIGN KEY (`tag_name`) REFERENCES `tags` (`tag_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4:
Cannot find an index in the referenced table where the
referenced columns appear as the first columns, or column types
in the table and the referenced table do not match for constraint.
Note that the internal storage type of ENUM and SET changed in
tables created with >= InnoDB-4.1.12, and such columns in old tables
cannot be referenced by such columns in new tables.
See http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html
for correct foreign key definition.
有人能告诉我这是怎么回事吗?
4条答案
按热度按时间2ledvvac1#
我也犯了这个错误。
我想你和我做了同样的事情:将整个数据库设置为
UTF8
,然后将某些列/表更改为UTF8MB4
。我不知道该怎么解决。不过,有个变通办法:在转储SQL文件中将所有
UTF8MB4
更改回UTF8,将其恢复到DB中,并通过以下命令手动将特定列更改为UTF8MB4
:ercv8c1e2#
我的转储和数据库中没有utf8mb4字符集,但遇到了问题。
我解决了它删除所有的表和恢复我的转储后。
使用以下命令:How to remove all MySQL tables from the command-line without DROP database permissions?
mwngjboj3#
这个问题的另一个可能的解释是,当你执行一个
mysqldump
时,在转储文件顶部生成的CREATE TABLE
节可能是不完整的。转储文件通常以一段ALTER TABLE
语句结束,这些语句用于创建主键、外键和索引等。还原此类转储文件时(或提取),MySQL尝试在数据到达
ALTER TABLE
语句之前插入数据。(即,只有一个表正在被恢复)。为了克服这个问题,您可以做的是修改生成的CREATE TABLE
语句,使其完整,并且不需要任何进一步的ALTER TABLE
语句。dnph8jn44#
不管这对谁有帮助,我也遇到了同样的问题,因为我使用了
mysqldump
的--compact
选项。事实证明,该选项生成的脚本没有设置
FOREIGN_KEY_CHECKS=0
。文档中没有说明此选项产生的转储不能按原样用于数据库重建,因此要注意这一点。