Ошибка ORA-02292: integrity constraint violated - child record found
- Операции
DELETEилиTRUNCATEзавершаются с ошибкойORA-02292: integrity constraint (SCHEMA.FK_NAME) violated - child record found. - Попытка удалить строку из справочника/таблицы блокируется наличием связанных строк в зависимых таблицах.
- Очистка устаревших архивных данных завершается аварийным откатом транзакции.
1. Поиск дочерней таблицы, вызвавшей блокировку удаления
SELECT a.table_name AS child_table,
a.constraint_name,
c_pk.table_name AS parent_table
FROM all_constraints a
JOIN all_constraints c_pk ON a.r_constraint_name = c_pk.constraint_name
WHERE a.constraint_name = 'FK_NAME' AND a.owner = 'SCHEMA_NAME';2. Просмотр зависимых дочерних записей
SELECT * FROM child_table WHERE parent_id_fk = 12345;3. Настройка каскадного удаления (ON DELETE CASCADE)
Пересоздайте ограничение внешнего ключа для автоматического удаления дочерних строк:
ALTER TABLE child_table DROP CONSTRAINT fk_name;
ALTER TABLE child_table ADD CONSTRAINT fk_name
FOREIGN KEY (parent_id_fk) REFERENCES parent_table(id)
ON DELETE CASCADE;4. Удаление зависимых записей вручную
DELETE FROM child_table WHERE parent_id_fk = 12345;
DELETE FROM parent_table WHERE id = 12345;
COMMIT; Частые вопросы (FAQ)
Почему TRUNCATE TABLE падает с ошибкой ORA-02266 / ORA-02292?
Команда TRUNCATE является DDL-операцией и не может выполняться на таблице, на которую ссылаются включенные внешние ключи других таблиц, даже если дочерние таблицы пусты.
Что делает опция ON DELETE SET NULL?
При удалении записи в родительской таблице Oracle автоматически установит значение NULL в соответствующих полях дочерней таблицы вместо генерации ошибки ORA-02292.
Как временно удалить данные без удаления дочерних строк?
Отключите ограничение: ALTER TABLE child_table DISABLE CONSTRAINT fk_name; выполните удаление и включите обратно в режиме NOVALIDATE.
Влияет ли отсутствие индекса на внешнем ключе на скорость удаления?
Да, если на столбцах Foreign Key в дочерней таблице нет индекса, удаление строки из родительской таблицы вызывает полную блокировку всей дочерней таблицы (Table Share Lock).