sql >> Databáze >  >> RDS >> Oracle

Oracle - odstranit všechny podřízené záznamy pro rodiče

To je do značné míry to, co primární klíče a cizí klíče a klauzule jako ON DELETE CASCADE jsou pro. Pokud ještě není pozdě, můžete zkusit přidat omezení PK a FK, než provedete jakékoli mazání; pak bude všechno snadné.

PŘIDÁNO :Na základě další diskuse. Níže uvedený dotaz lze použít k nalezení všech podřízených tabulek nadřazené tabulky. Dotaz může být pravděpodobně vylepšen mnoha způsoby, ale může to být dobrý výchozí bod.

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;

"Nadřazená" tabulka je v tomto případě ZAMĚSTNANCI a jméno se objeví dvakrát, na stejném řádku. Z toho lze v případě potřeby vytvořit proměnnou vazby. Použil jsem EMPLOYEES (poznámka:musí to být velkými písmeny, protože tak jsou hodnoty řetězců uloženy v systémových tabulkách), protože jsem to spustil na standardním HR schématu; výstup:

  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. MySQL Match Against s více hodnotami proti

  2. Jaký je maximální počet povolených parametrů na typ poskytovatele databáze?

  3. MySQL Vícenásobné započítání v jednom dotazu s případem velikosti písmen

  4. Proč chyba:[Správce ovladačů ODBC] Název zdroje dat nebyl nalezen...? (funguje dobře na vývojovém prostředí)