【问题标题】:ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails for existing tablesERROR 1452 (23000):无法添加或更新子行:现有表的外键约束失败
【发布时间】:2013-10-08 07:03:10
【问题描述】:

将外键分配给现有表列时出现以下错误:

错误 1452 (23000):无法添加或更新子行:外键约束失败 (c_x_parsing.#sql-787_1, CONSTRAINT #sql-787_1_ibfk_1 FOREIGN KEY (nct_id) REFERENCES cdb (nct_id ))

下面是我的查询:

ALTER TABLE c_int ADD FOREIGN KEY (n_id) REFERENCES cdb (n_id);

而我的父表是 cdb cdb 而子表是 c_int。

请向我建议解决方案,因为我已经尝试过以下命令:

ALTER TABLE cdb ENGINE=InnoDB;
ALTER TABLE c_int ENGINE=InnoDB;

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

    问题不在于命令,而在于数据。子表中存在父表中不存在的值。

    尝试使用类似的方法来找出导致问题的数据:

    SELECT n_id FROM c_int WHERE n_id NOT IN (SELECT n_id FROM cdb)
    

    【讨论】:

    • 你是对的。父表中缺少一些 id,而这些 id 存在于子表中。有什么方法可以通过忽略子表中存在但父表中不存在的 id 来做同样的事情,还是我必须重新填充表?
    • 您的建议意味着您的外键无效。您可以考虑为“未知”或其他不重要的条目创建一个 unqiue id,然后更新子表以确保所有其他条目都指向新的 id。
    • 我也有同样的情况。对我来说就像魅力一样。
    • 使用示例,REMOVE FROM c_int WHERE n_id NOT IN (SELECT n_id FROM cdb) 为我工作。
    【解决方案2】:

    似乎 c_int 表中有一些记录,它们的 n_id 值在 cdn 表中不可用。

    我建议两种解决方案

    第一个禁用约束检查

    SET FOREIGN_KEY_CHECKS = 0;
    ALTER TABLE c_int ADD FOREIGN KEY (n_id) REFERENCES cdb (n_id);
    

    第二次删除或更新这些数据

    delete FROM c_int WHERE n_id NOT IN (SELECT n_id FROM cdb)
    

    【讨论】:

      【解决方案3】:

      请检查这两个字段的排序规则和字符集。 cdb(n_id) 和父表中的列

      【讨论】:

        猜你喜欢
        • 2013-05-03
        • 1970-01-01
        相关资源
        最近更新 更多