Найдите строки, в которых сбой внешнего ключа
При попытке добавить ограничение внешнего ключа к двум очень большим таблицам, я получаю сообщение об ошибке.
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails
Обычно это связано с тем, что некоторые данные в первичной таблице не присутствуют во внешней таблице, обычно я проверяю известные аномалии, такие как нулевые значения, вне значений диапазона и т.д., после того, как об этом позаботятся, я могу получить ограничение, Однако на этот раз проблема более тонкая.
Что я хочу знать, есть ли способ запросить для всех строк, которые вызывают ограничение, сбой?
Ответы
Ответ 1
Предполагая, что у вас есть следующая таблица и отношения 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;
Ответ 2
Решение InoS Heo будет работать. Вот еще один способ.
SELECT *
FROM child
WHERE NOT key IN (
SELECT key
FROM parent
);
Конечно, key
- это целевое поле (ы), которое вы намерены назначить позже.