【问题标题】:MySQL "Cannot add or update a child row: a foreign key constraint fails"MySQL“无法添加或更新子行:外键约束失败”
【发布时间】:2015-06-06 04:18:47
【问题描述】:

我是 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,因此无法复制,这就是错误的样子最常产生于。

如果这有助于回答,我可以发布有问题的表格,但我不确定最好的方法,所以一些指向正确方向的方法也会有所帮助。

我之前看过的帖子:

对于formingcommand

对于lookingerror

谢谢!

【问题讨论】:

    标签: mysql foreign-keys database-schema


    【解决方案1】:

    您需要在目标表上运行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,但如果可能的话我会避免这样做,因为外键的目的是确保数据完整性。

    【讨论】:

    • 感谢您关闭外键检查。除非我这样做,否则无法添加一些相互交织的条目,我可能会为整个数据库这样做。
    猜你喜欢
    • 2015-07-26
    • 2012-10-09
    • 2016-08-09
    • 2011-03-31
    • 2013-08-10
    • 1970-01-01
    • 2016-05-23
    • 2012-03-14
    • 1970-01-01
    相关资源
    最近更新 更多