sql >> Databasteknik >  >> RDS >> Oracle

Oracle - radera alla underordnade poster för en förälder

Detta är i stort sett vad primärnycklar och främmande nycklar och satser som ON DELETE CASCADE är för. Om det inte är för sent kan du försöka lägga till PK- och FK-begränsningar innan du gör några raderingar; då blir allt enkelt.

LÄGG TILL :Baserat på vidare diskussion. Frågan nedan kan användas för att hitta alla underordnade tabeller till en överordnad tabell. Frågan kan förmodligen förbättras på många sätt, men det kan vara en OK utgångspunkt.

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;

Tabellen "förälder" i det här fallet är ANSTÄLLDA och namnet visas två gånger, på samma rad. Det kan göras till en bindningsvariabel om det behövs. Jag använde ANSTÄLLDA (obs:det måste vara i stora bokstäver eftersom det är så strängvärden lagras i systemtabeller) eftersom jag körde detta på standard HR-schema; utdata:

  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


  1. Hantera MySQL med phpMyAdmin på Debian 5 (Lenny)

  2. SQL Välj endast rader där det finns flera relationer

  3. SQL-sorteringstabell baserad på två utbytbara fält

  4. IN uttalande i Eloquent