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

Oracle - supprimer tous les enregistrements enfants d'un parent

C'est à peu près ce que les clés primaires et les clés étrangères et les clauses comme ON DELETE CASCADE sont pour. S'il n'est pas trop tard, vous pouvez essayer d'ajouter des contraintes PK et FK avant de faire des suppressions; alors tout sera facile.

AJOUTÉ :Basé sur une discussion plus approfondie. La requête ci-dessous peut être utilisée pour trouver toutes les tables descendantes d'une table parent. La requête peut probablement être améliorée de plusieurs façons, mais cela peut être un bon point de départ.

with f as (
        select constraint_name, table_name, r_constraint_name
        from   user_constraints
        where  constraint_type = 'R'
     ),
     p as (
        select constraint_name, table_name
        from   user_constraints
        where  constraint_type = 'P'
     ),
     j (child_table, f_key, parent_table, p_key) as (
        select f.table_name, f.constraint_name, p.table_name, f.r_constraint_name
        from   p join f on p.constraint_name = f.r_constraint_name
        union all
        select 'EMPLOYEES', (select constraint_name from p 
                                where table_name = 'EMPLOYEES'), null, null from dual
     )
select level as lvl, j.*
from j
start with parent_table is null
connect by nocycle parent_table = prior child_table
order by lvl, parent_table, child_table;

La table "parente" dans ce cas est EMPLOYEES et le nom apparaît deux fois, sur la même ligne. Cela peut être transformé en une variable de liaison si nécessaire. J'ai utilisé EMPLOYEES (remarque :il doit être en majuscules car c'est ainsi que les valeurs de chaîne sont stockées dans les tables système) car j'ai exécuté ceci sur le schéma RH standard ; sortie :

  LVL CHILD_TABLE       F_KEY                PARENT_TABLE      P_KEY
----- ----------------- -------------------- ----------------- -----------------
    1 EMPLOYEES         EMP_EMP_ID_PK
    2 DEPARTMENTS       DEPT_MGR_FK          EMPLOYEES         EMP_EMP_ID_PK
    2 JOB_HISTORY       JHIST_EMP_FK         EMPLOYEES         EMP_EMP_ID_PK
    3 JOB_HISTORY       JHIST_DEPT_FK        DEPARTMENTS       DEPT_ID_PK