如何使用自引用外键从表中删除行

时间:2015-02-23 16:14:07

标签: sql oracle oracle10g

我想从表中删除行。这个表的区别在于一列主键和同一个表上的另一个是外键。不要问我为什么会这样,因为和你一样,我认为这是一个设计缺陷。目标是,使用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 个答案:

答案 0 :(得分:0)

删除约束,删除要删除的行,最后重新创建约束。但是,如果删除另一行引用的行,则应删除子行,否则将不允许在该过程结束时重新创建约束。

答案 1 :(得分:0)

你试过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.