Найдите строки, в которых сбой внешнего ключа

При попытке добавить ограничение внешнего ключа к двум очень большим таблицам, я получаю сообщение об ошибке.

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 - это целевое поле (ы), которое вы намерены назначить позже.