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

親テーブルと子テーブルからの行の削除

    2つの可能なアプローチ。

    1. 外部キーがある場合は、それをon-delete-cascadeとして宣言し、30日より古い親行を削除します。すべての子行が自動的に削除されます。

    2. 説明に基づくと、削除する親行がわかっていて、対応する子行を削除する必要があるようです。このようなSQLを試しましたか?

        delete from child_table
            where parent_id in (
                 select parent_id from parent_table
                      where updd_tms != (sysdate-30)
      

      -ここで、親テーブルレコードを削除します

      delete from parent_table
      where updd_tms != (sysdate-30);
      

    ----要件に基づいて、PL/SQLを使用する必要があるようです。誰かがこれに純粋なSQLソリューションを投稿できるかどうかを確認します(その場合、それは間違いなく進むべき道です)。

    declare
        v_sqlcode number;
        PRAGMA EXCEPTION_INIT(foreign_key_violated, -02291);
    begin
        for v_rec in (select parent_id, child id from child_table
                             where updd_tms != (sysdate-30) ) loop
    
        -- delete the children
        delete from child_table where child_id = v_rec.child_id;
    
        -- delete the parent. If we get foreign key violation, 
        -- stop this step and continue the loop
        begin
           delete from parent_table
              where parent_id = v_rec.parent_id;
        exception
           when foreign_key_violated
             then null;
        end;
     end loop;
    end;
    /
    


    1. Postgresでのみ関数のバックアップを取る方法

    2. SQLServerで複数の列をピボットする方法

    3. SQLiteに存在する場合のドロップテーブル

    4. JSON_OBJECT()–MySQLのキー/値ペアのリストからJSONオブジェクトを作成します