我是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`;
这可能会显示表上有一个外键,这要求在将值添加到此表中之前存在于另一个表中。 具体来说,从您的错误来看,该字段ticket_id
引用了ticket
表中的id
字段。 这在需要首先迁移的内容方面引入了一些复杂性 - 引用表(ticket
(必须在引用表(article
(之前填充。
在不了解您的表的情况下,我的猜测是您尚未在ticket
表中迁移,并且它是空的。 您需要先执行此操作,然后才能填写B
。article
表。 您的数据也可能已损坏,您需要查找您尝试发送的article
数据中存在哪个票证 ID,但在ticket
表中不存在。
另一种选择是关闭外键检查,但如果可能的话,我会避免这样做,因为外键的目的是确保数据完整性。