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

How can I Delete row from table with self reference foreign key

我想从 table 中删除行。这个 table 的区别是作为一列主键,而在同一 table 上的另一列是外键。不要问我为什么会这样,因为我和你一样认为这是设计缺陷。目标是在特定日期之前使用 pl/sql 程序从 table 中删除记录。下面我继续

 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

我认为这是正常的,因为例如如果我的 table 有这些数据:

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 的行?

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

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