【问题标题】:A foreign key constraint fails when adding a foreign key添加外键时外键约束失败
【发布时间】:2018-05-17 18:55:32
【问题描述】:

我有两个预先存在的表,bar(有 2 列,id [int 11] 和 name)和 foo_bar(有 3 列,idfoo_id 和 @987654327 @ [int 11])。 (还有一个表foo,但这与这里无关。)

我想添加到foo_bar 的迁移,以便当从bar 中删除一行时,它会删除foo_bar 中的相关行。这是我的声明:

ALTER TABLE `foo_bar` ADD FOREIGN KEY (`bar_id`) REFERENCES `bar`(`id`) ON DELETE CASCADE

但是当我运行它时,我得到了这个错误:

1452 - 无法添加或更新子行:外键约束失败 (dbn.#sql-1_10ad, CONSTRAINT #sql-1_10ad_ibfk_1 FOREIGN KEY (bar_id) REFERENCES bar (id) ON DELETE CASCADE )

bar 表上的bar_idid 的类型均为int(11)bar 表上的 id 是主键。

【问题讨论】:

  • 1) 通过在测试环境中创建 2 个表(无数据)并运行 alter 语句来检查您的语法。 2) 如果 1 没问题,那么问题出在数据上。

标签: mysql sql foreign-keys


【解决方案1】:

我的猜测是有一个外键bar_id 指的是bar 表中不存在的id。您可以使用以下查询找到它:

SELECT *
FROM foo_bar fb
LEFT JOIN bar b
    on fb.bar_id = b.id
WHERE b.id IS NULL;

要解决此问题,您可以从foo_bar 中删除这些有问题的记录,也可以将它们更新为指向bar 中实际存在的父行。

【讨论】:

    【解决方案2】:

    我认为问题在于已经存在违反约束的行。您可以通过运行查看是否是这种情况:

    select fb.*
    from foo_bar fb
    where not exists (select 1 from bar b where b.id = fb.id);
    

    如果是这种情况,则删除有问题的行,然后再次尝试添加约束。

    【讨论】:

      猜你喜欢
      • 2019-12-06
      • 1970-01-01
      • 2021-06-11
      • 2013-05-29
      • 1970-01-01
      • 2014-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多