我对 MySQL 和数据库总体来说是新手。我的任务是手动将旧数据库移动到格式略有不同的新数据库。挑战包括将某些列从一个数据库中的表传输到另一个类似格式的数据库。由于源数据库是 MyISAM 而目标数据库是 InnoDB,这使得这变得更加困难。
所以我有两个数据库,A 是源,B 是目标,并且正在尝试将表的“大部分”复制到目标数据库中的类似表。
这是我运行的命令:
INSERT INTO B.article (id, ticket_id, article_type_id,
article_sender_type_id, a_from, a_reply_to, a_to, a_cc, a_subject,
a_message_id, a_in_reply_to, a_references, a_content_type, a_body,
incoming_time, content_path, valid_id, create_time, create_by,change_time,
change_by)
SELECT id, ticket_id, article_type_id, article_sender_type_id,
a_from, a_reply_to, a_to, a_cc, a_subject, a_message_id, a_in_reply_to,
a_references, a_content_type, a_body, incoming_time, content_path,
valid_id, create_time, create_by, change_time, change_by
FROM A.article
WHERE id NOT IN ( 1 );
错误:
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`helpdesk`.`article`, CONSTRAINT `FK_article_ticket_id_id` FOREIGN KEY (`ticket_id`) REFERENCES `ticket` (`id`))
使命令如此冗长的原因是源有几个不必要的列,因此被从目标表中删除。 WHERE id NOT IN ( 1 ) 存在,因此第一行不会被复制(它在两个数据库中都已初始化,如果它们都具有相同的“id”字段,MySQL 会抛出错误)。我无法通过错误判断它是否期望“ticket_id”在行之间是唯一的,但事实并非如此,或者它是否声称某行没有ticket_id,因此无法复制,这就是错误的含义最常由以下生成。
我可以发布有问题的表格,如果这有助于回答,但我不确定最好的方法,所以一些指向正确方向的也会有帮助。
我之前看过的帖子:
谢谢!
最佳答案
您需要在目标表上运行 SHOW CREATE TABLE
:
SHOW CREATE TABLE `B`.`article`;
这可能会告诉您有一个 foreign key在表上,这要求另一个表中存在一个值,然后才能将其添加到此表中。具体来说,从您的错误来看,字段 ticket_id
引用了 ticket
表中的 id
字段。这在需要首先迁移的内容方面引入了一些复杂性 - 必须在引用表 (article
) 之前填充引用表 (ticket
)。
在不了解有关您的表的更多信息的情况下,我的猜测是您尚未在 ticket
表中迁移,并且它是空的。您需要先执行此操作,然后才能填写 B
.article
表。您的数据也可能已损坏,您需要查找您尝试发送的 article
数据中存在哪个工单 ID,但在 ticket
中不存在> 表。
另一种选择是 turn off foreign key checks ,但如果可能的话我会避免这种情况,因为外键的目的是确保数据完整性。
关于MySQL "Cannot add or update a child row: a foreign key constraint fails",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29392141/