我有两个预先存在的表格bar
(包含2列,id
[int 11]和name
)和foo_bar
(包含3列,{{ 1}},id
和foo_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
表格中id
和bar_id
的类型均为id
。 bar
表上的int(11)
是主键。
答案 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);
如果是这种情况,则删除有问题的行,然后再次尝试添加约束。