Oracle
 sql >> Database >  >> RDS >> Oracle

Eliminazione di righe dalle tabelle padre e figlio

Due possibili approcci.

  1. Se hai una chiave esterna, dichiarala come on-delete-cascade ed elimina le righe principali più vecchie di 30 giorni. Tutte le righe figlie verranno eliminate automaticamente.

  2. In base alla tua descrizione, sembra che tu conosca le righe principali che desideri eliminare e che sia necessario eliminare le righe secondarie corrispondenti. Hai provato SQL in questo modo?

      delete from child_table
          where parent_id in (
               select parent_id from parent_table
                    where updd_tms != (sysdate-30)
    

    -- ora elimina i record della tabella padre

    delete from parent_table
    where updd_tms != (sysdate-30);
    

---- In base alle tue esigenze, sembra che potresti dover utilizzare PL/SQL. Vedrò se qualcuno può pubblicare una soluzione SQL pura a questo (nel qual caso sarebbe sicuramente la strada da percorrere).

declare
    v_sqlcode number;
    PRAGMA EXCEPTION_INIT(foreign_key_violated, -02291);
begin
    for v_rec in (select parent_id, child id from child_table
                         where updd_tms != (sysdate-30) ) loop

    -- delete the children
    delete from child_table where child_id = v_rec.child_id;

    -- delete the parent. If we get foreign key violation, 
    -- stop this step and continue the loop
    begin
       delete from parent_table
          where parent_id = v_rec.parent_id;
    exception
       when foreign_key_violated
         then null;
    end;
 end loop;
end;
/