sql >> Databasteknik >  >> RDS >> PostgreSQL

Stack Depth Limit har överskridits i PostgresQL (efter borttagningsutlösare)

Så långt är det vad som händer:

  1. Ta bort barn1.
  2. Utlöser borttagning av förälder.
  3. Tar bort n syskon till barn1 genom att DELETE CASCADE .
  4. Anropar samma utlösare n gånger.
  5. Inga fler syskon kvar.

Ingen ändlös loop, men ändå n anrop av utlösaren. Det kan förklara varför din stackdjupsgräns överskreds, men du kan fixa det genom att öka gränsen. Samma sak kan hända igen med ett större n .

Som ett alternativ, ersätt din utlösare med:

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

Och ersätt FK-begränsningen med en version utan ON DELETE CASCADE . Kodexempel:

Nu till DELETE en hel familj kan man inte radera föräldern som tidigare (nu förbjudet av FK). Istället DELETE vilket barn som helst.

Bör vara snabbare också.




  1. JDBC-anslutningen misslyckades, fel:TCP/IP-anslutningen till värden misslyckades

  2. @-symbol i lagrad procedur?

  3. Välj högsta 3 poäng varje dag för varje användare

  4. Hur kan jag kontrollera MySQL-motortypen för en specifik tabell?