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

Oracle:elimina tutti i record figlio per un genitore

Questo è praticamente ciò che chiavi primarie e chiavi esterne e clausole come ON DELETE CASCADE sono per. Se non è troppo tardi, puoi provare ad aggiungere vincoli PK e FK prima di eseguire qualsiasi eliminazione; allora tutto sarà facile.

AGGIUNTO :Basato su un'ulteriore discussione. La query seguente può essere utilizzata per trovare tutte le tabelle discendenti di una tabella padre. La query potrebbe probabilmente essere migliorata in molti modi, ma potrebbe essere un buon punto di partenza.

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 tabella "padre" in questo caso è EMPLOYEES e il nome compare due volte, sulla stessa riga. Questo può essere trasformato in una variabile di collegamento, se necessario. Ho usato EMPLOYEES (nota:deve essere tutto maiuscolo perché è così che i valori delle stringhe vengono memorizzati nelle tabelle di sistema) perché l'ho eseguito sullo schema HR standard; uscita:

  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