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

Oracle - slet alle underordnede poster for en forælder

Dette er stort set hvad primærnøgler og fremmednøgler og klausuler som ON DELETE CASCADE er til. Hvis det ikke er for sent, kan du prøve at tilføje PK- og FK-begrænsninger, før du sletter noget. så bliver alt nemt.

TILFØJET :Baseret på yderligere diskussion. Forespørgslen nedenfor kan bruges til at finde alle efterkommertabeller i en overordnet tabel. Forespørgslen kan sandsynligvis være forbedret på mange måder, men det kan være et OK udgangspunkt.

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;

"Overordnet"-tabellen i dette tilfælde er MEDARBEJDERE, og navnet vises to gange på samme linje. Det kan laves til en bind-variabel, hvis det er nødvendigt. Jeg brugte MEDARBEJDERE (bemærk:det skal være i store bogstaver, fordi det er sådan strengværdier er gemt i systemtabeller), fordi jeg kørte dette på standard HR-skemaet; output:

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. Indstil session med postdata

  2. MySQL - hent en værdi fra en anden tabel, hvis kolonnen er null

  3. Tæl alle underordnede noder af hierarkiske data i en tabel

  4. PostgreSQL Regex-ordgrænser?