MySQL "Cannot add or update a child row: a foreign key constraint fails"
MySQL "Cannot add or update a child row: a foreign key constraint fails"
我是 MySQL 和一般数据库的新手。我的任务是手动将旧数据库移动到格式略有不同的新数据库。挑战包括将某些列从一个数据库中的 table 转移到另一个格式相似的数据库。这变得更加困难,因为源数据库是 MyISAM 而目标是 InnoDB。
所以我有两个数据库,A 是源,B 是目标,我正在尝试将 table 的 'most' 复制到目标数据库中的类似 table .
这是命令我 运行:
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`))
使命令如此冗长的原因是源中有几列是不必要的,因此从目标 table 中删除了 运行。 WHERE id NOT IN ( 1 ) 在那里,所以第一行不会被复制(它在两个数据库中都被初始化,如果它们都有相同的 'id' 字段, MySQL 会抛出错误)。我无法通过错误判断它是否期望 'ticket_id' 在行之间是唯一的,但事实并非如此,或者它是否声称某行没有 ticket_id 因此无法复制这似乎是最常产生错误的原因。
我可以 post 有问题的 table 如果这有助于回答,但我不确定最好的方法,所以一些指向正确方向的人会有帮助还有。
之前看过的帖子:
对于forming the command
对于looking at this error
谢谢!
您需要 运行 SHOW CREATE TABLE
目的地 table:
SHOW CREATE TABLE `B`.`article`;
这可能会告诉您 table 上有一个 foreign key,它要求值存在于另一个 table 中才能添加到这个值。具体来说,根据您的错误,字段 ticket_id
似乎引用了 ticket
table 中的 id
字段。这在首先需要迁移的内容方面引入了一些复杂性——引用的 table (ticket
) 必须在引用 table (article
) 之前填充。
在不了解您的 table 的情况下,我的猜测是您尚未在 ticket
table 中迁移,并且它是空的。在填写 B
.article
table 之前,您需要这样做。也有可能您的数据已损坏,您需要找到您尝试发送的 article
数据中存在但不存在于 ticket
table 中的工单 ID .
另一种选择是 turn off foreign key checks,但如果可能的话我会避免这样做,因为外键的目的是确保数据完整性。
我是 MySQL 和一般数据库的新手。我的任务是手动将旧数据库移动到格式略有不同的新数据库。挑战包括将某些列从一个数据库中的 table 转移到另一个格式相似的数据库。这变得更加困难,因为源数据库是 MyISAM 而目标是 InnoDB。
所以我有两个数据库,A 是源,B 是目标,我正在尝试将 table 的 'most' 复制到目标数据库中的类似 table .
这是命令我 运行:
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`))
使命令如此冗长的原因是源中有几列是不必要的,因此从目标 table 中删除了 运行。 WHERE id NOT IN ( 1 ) 在那里,所以第一行不会被复制(它在两个数据库中都被初始化,如果它们都有相同的 'id' 字段, MySQL 会抛出错误)。我无法通过错误判断它是否期望 'ticket_id' 在行之间是唯一的,但事实并非如此,或者它是否声称某行没有 ticket_id 因此无法复制这似乎是最常产生错误的原因。
我可以 post 有问题的 table 如果这有助于回答,但我不确定最好的方法,所以一些指向正确方向的人会有帮助还有。
之前看过的帖子:
对于forming the command
对于looking at this error
谢谢!
您需要 运行 SHOW CREATE TABLE
目的地 table:
SHOW CREATE TABLE `B`.`article`;
这可能会告诉您 table 上有一个 foreign key,它要求值存在于另一个 table 中才能添加到这个值。具体来说,根据您的错误,字段 ticket_id
似乎引用了 ticket
table 中的 id
字段。这在首先需要迁移的内容方面引入了一些复杂性——引用的 table (ticket
) 必须在引用 table (article
) 之前填充。
在不了解您的 table 的情况下,我的猜测是您尚未在 ticket
table 中迁移,并且它是空的。在填写 B
.article
table 之前,您需要这样做。也有可能您的数据已损坏,您需要找到您尝试发送的 article
数据中存在但不存在于 ticket
table 中的工单 ID .
另一种选择是 turn off foreign key checks,但如果可能的话我会避免这样做,因为外键的目的是确保数据完整性。