Я хочу удалить строки из таблицы. Эта таблица отличается тем, что является первичным ключом одного столбца, а другая в той же таблице является внешним ключом. Не спрашивайте меня, почему это так, потому что, как и вы, я считаю, что это недостаток дизайна. Цель состоит в том, чтобы удалить записи из этой таблицы до определенной даты с помощью процедуры pl / sql. Ниже мой способ продолжить
CREATE OR REPLACE PROCEDURE purgeEvenement(annee IN VARCHAR2) IS-- "
eve_child_id_to_delete DBMS_SQL.Number_Table;-- "
BEGIN-- "
SELECT e.eve_child_id BULK COLLECT INTO eve_child_id_to_delete from evenement e where EXTRACT(year from e.eve_d_date_heure_event)<annee;-- "
FORALL i IN eve_child_id_to_delete.first..eve_child_id_to_delete.last-- "
DELETE FROM evenement e-- "
WHERE e.eve_child_id = eve_child_id_to_delete(i);-- "
COMMIT;--"
DELETE FROM evenement e where EXTRACT(year from e.eve_d_date_heure_event)<annee;-- "
COMMIT;-- "
END;-- "
Но у меня такая ошибка
ORA-02292: violation de contrainte (EMM_INT.EVE_FK_EVE_CHILD) d'intégrité - enregistrement fils existant
ORA-06512: à "EMM_INT.PURGEEVENEMENT", ligne 5
ORA-06512: à ligne 6
Я думаю, это нормально, потому что, например, если в моей таблице есть эти данные:
Eve_id (Constraint PK) EVE_CHILD_ID(Constraints FK)
1 3
4 2
3 1
5 3
Моя процедура pls / sql не удалась из-за предыдущей ошибки ORA-02292.
Как, например, удалить строку, в которой EVE_CHILD_ID = 3?
2 ответа
Отбросьте ограничение, удалите строки, которые вы хотите удалить, и в конце заново создайте ограничение. Однако, если вы удаляете строку, на которую ссылаются другие строки, вы должны также удалить дочерние строки, иначе вам не будет разрешено воссоздать ограничение в конце процесса.
Вы пробовали ON DELETE CASCADE
? Пожалуйста, попробуйте добавить такое ограничение:
ALTER TABLE YOUR_TABLE ADD (
CONSTRAINT YOUR_TAB_R01
FOREIGN KEY (EVE_CHILD_ID)
REFERENCES YOUR_TABLE (EVE_ID)
ON DELETE CASCADE
ENABLE VALIDATE)
Это означает, что при удалении записи будут удалены все его ссылки.
Например, с этими данными:
Eve_id (Constraint PK) EVE_CHILD_ID(Constraints FK)
1 3
4 4
3 4
5 3
Этот запрос: delete recursive_tab where EVE_CHILD_ID = 3
удалите все записи, которые имеют зависимости с 3
, поэтому your_table
должен выглядеть так:
EVE_ID EVE_CHILD_ID
---------- ------------
4 4
3 4
2 rows selected.
Похожие вопросы
Связанные вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.