在尝试将外键约束添加到两个非常大的表时,我收到了错误。
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails
这通常是由于主表中的某些数据不存在于外表中,通常我检查已知的异常,如空值,超出范围值等,一旦这些被处理,我可以得到约束满足。不过这次问题更加微妙。
我想知道有没有办法查询导致约束失败的所有行?
答案 0 :(得分:26)
假设您有以下表格和FK关系。
parent(parent_id (PK), name)
child(child_id, name, parent_id (FK));
您可以使用以下parent
找到child
表中缺少但在LEFT JOIN
表中的哪些行:
SELECT child.parent_id
FROM child LEFT JOIN parent ON child.parent_id = parent.parent_id
WHERE parent.parent_id IS NULL;
答案 1 :(得分:11)
InoS Heo的解决方案将起作用。这是另一种方式。
SELECT *
FROM child
WHERE NOT key IN (
SELECT key
FROM parent
);
当然key
是您打算稍后设置约束的目标字段。