これまでのところ、それが起こります:
- child1を削除します。
- 親の削除をトリガーします。
-
n
を削除しますDELETE CASCADE
によるchild1の兄弟 。 - 同じトリガーを呼び出す
n
- 兄弟はもう残っていません。
無限のループはありませんが、それでも 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
どんな子供でも。
速いはずです。