添加外键

时间:2018-05-17 10:51:07

标签: mysql sql foreign-keys

我有两个预先存在的表格bar(包含2列,id [int 11]和name)和foo_bar(包含3列,{{ 1}},idfoo_id [int 11])。 (还有bar_id表,但这里没有相关内容。)

我想将迁移添加到foo,以便在从foo_bar删除某行时删除bar中的相关行。这是我的发言:

foo_bar

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

  

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

bar表格中idbar_id的类型均为idbar表上的int(11)是主键。

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

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

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