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