PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Stack Depth Limit in PostgresQL überschritten (nach Delete Trigger)

Bisher passiert Folgendes:

  1. Kind1 löschen.
  2. Löst das Löschen des übergeordneten Elements aus.
  3. Löscht n Geschwister von Kind1 durch DELETE CASCADE .
  4. Ruft denselben Trigger n auf mal.
  5. Keine Geschwister mehr übrig.

Keine Endlosschleife, aber trotzdem n Aufrufe des Triggers. Das könnte erklären, warum Ihr Stapeltiefenlimit überschritten wurde, aber Sie können es beheben, indem Sie das Limit erhöhen. Dasselbe könnte mit einem größeren n wieder passieren .

Alternativ ersetzen Sie Ihren Trigger durch:

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();

Und ersetzen Sie die FK-Einschränkung durch eine Version ohne ON DELETE CASCADE . Codebeispiel:

Nun zum DELETE eine ganze Familie, Sie können den Elternteil nicht wie zuvor löschen (jetzt von FK verboten). Stattdessen DELETE jedes Kind.

Sollte auch schneller sein.