sql >> データベース >  >> RDS >> Oracle

Oracle-親のすべての子レコードを削除します

    これは、ON DELETE CASCADEのような主キーと外部キーおよび句とほぼ同じです。 のためです。手遅れでない場合は、削除を行う前にPKおよびFK制約を追加してみてください。そうすれば、すべてが簡単になります。

    追加 :さらなる議論に基づく。以下のクエリを使用して、親テーブルのすべての子孫テーブルを検索できます。クエリはおそらく多くの点で改善される可能性がありますが、それは問題のない出発点になる可能性があります。

    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;
    

    この場合の「親」テーブルはEMPLOYEESであり、名前は同じ行に2回表示されます。必要に応じて、これをバインド変数にすることができます。標準のHRスキーマでこれを実行したため、EMPLOYEESを使用しました(注:文字列値がシステムテーブルに格納される方法であるため、すべて大文字にする必要があります)。出力:

      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の複数IDルックアップ

    2. DEFERRABLE INITIALLY IMMEDIATEで定義された制約はまだ延期されていますか?

    3. Oracle正規表現の最後の出現からの文字列の分割

    4. 配列要素にアクセスする方法