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

PostgresQLでスタック深度制限を超えました(トリガーの削除後)

    これまでのところ、それが起こります:

    1. child1を削除します。
    2. 親の削除をトリガーします。
    3. nを削除します DELETE CASCADEによるchild1の兄弟 。
    4. 同じトリガーを呼び出すn
    5. 兄弟はもう残っていません。

    無限のループはありませんが、それでも n トリガーの呼び出し。これは、スタックの深さの制限を超えた理由を説明できますが、制限を増やすことで修正できます。 nを大きくすると、同じことが再び発生する可能性があります。 。

    別の方法として、トリガーを次のように置き換えます。

    CREATE OR REPLACE FUNCTION delete_family()
      RETURNS TRIGGER AS
    $func$
    BEGIN
        DELETE FROM child  WHERE parent_id = OLD.parent_id;
        DELETE FROM parent WHERE parent_id = OLD.parent_id;  -- done after 1st call
        RETURN NULL;
    END
    $func$ LANGUAGE plpgsql;  -- don't quote the language name!
    
    CREATE TRIGGER delete_family
    AFTER DELETE ON child 
    FOR EACH ROW EXECUTE PROCEDURE delete_family();
    

    そして、FK制約をなしのバージョンに置き換えます。 ON DELETE CASCADE 。コード例:

    次に、DELETE 家族全員で、以前のように親を削除することはできません(現在はFKによって禁止されています)。代わりにDELETE どんな子供でも。

    速いはずです。




    1. OracleユーザーアカウントのステータスをEXPIRE(GRACE)からOPENに変更します

    2. SQLとMySQL:集計操作とGROUPBYに関するルール

    3. java.sql.SQLException:jdbc:microsoft:sqlserverに適したドライバーが見つかりません

    4. すべてのカテゴリのトップ10製品を入手