Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle - alle untergeordneten Datensätze für einen übergeordneten Datensatz löschen

Das ist so ziemlich das, was Primärschlüssel und Fremdschlüssel und Klauseln wie ON DELETE CASCADE sind für. Wenn es noch nicht zu spät ist, können Sie versuchen, PK- und FK-Einschränkungen hinzuzufügen, bevor Sie irgendwelche Löschungen vornehmen; dann wird alles leicht.

Hinzugefügt :Basierend auf weiteren Diskussionen. Die folgende Abfrage kann verwendet werden, um alle Nachkommentabellen einer übergeordneten Tabelle zu finden. Die Abfrage kann wahrscheinlich in vielerlei Hinsicht verbessert werden, aber es kann ein guter Ausgangspunkt sein.

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;

Die "übergeordnete" Tabelle ist in diesem Fall EMPLOYEES und der Name erscheint zweimal in derselben Zeile. Das kann bei Bedarf in eine Bind-Variable umgewandelt werden. Ich habe EMPLOYEES verwendet (Hinweis:Es muss in Großbuchstaben geschrieben sein, da Zeichenfolgenwerte so in Systemtabellen gespeichert werden), weil ich dies auf dem Standard-HR-Schema ausgeführt habe. Ausgabe:

  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