Oracle
 sql >> Base de données >  >> RDS >> Oracle

Suppression de lignes des tables parent et enfant

Deux approches possibles.

  1. Si vous avez une clé étrangère, déclarez-la comme on-delete-cascade et supprimez les lignes parentes de plus de 30 jours. Toutes les lignes enfants seront supprimées automatiquement.

  2. D'après votre description, il semble que vous connaissiez les lignes parentes que vous souhaitez supprimer et que vous deviez supprimer les lignes enfants correspondantes. Avez-vous essayé SQL comme ça ?

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

    -- supprimer maintenant les enregistrements de la table parent

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

---- En fonction de vos besoins, il semble que vous deviez utiliser PL/SQL. Je vais voir si quelqu'un peut poster une solution SQL pure à cela (auquel cas ce serait certainement la voie à suivre).

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;
/