如何使用自引用外键从 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.
我想从 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.