Я хочу удалить строки из таблицы. Эта таблица отличается тем, что является первичным ключом одного столбца, а другая в той же таблице является внешним ключом. Не спрашивайте меня, почему это так, потому что, как и вы, я считаю, что это недостаток дизайна. Цель состоит в том, чтобы удалить записи из этой таблицы до определенной даты с помощью процедуры 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?

0
Pisix 23 Фев 2015 в 19:14

2 ответа

Лучший ответ

Отбросьте ограничение, удалите строки, которые вы хотите удалить, и в конце заново создайте ограничение. Однако, если вы удаляете строку, на которую ссылаются другие строки, вы должны также удалить дочерние строки, иначе вам не будет разрешено воссоздать ограничение в конце процесса.

0
Zsuzsa 23 Фев 2015 в 16:18

Вы пробовали 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.
0
Aramillo 23 Фев 2015 в 17:34