sql >> Database teknologi >  >> RDS >> PostgreSQL

Stack Depth Limit overskredet i PostgresQL (Efter sletning af trigger)

Indtil videre er det, hvad der sker:

  1. Slet barn1.
  2. Udløser sletning af forælder.
  3. Sletter n søskende til barn1 ved DELETE CASCADE .
  4. Kalder samme trigger n gange.
  5. Der er ikke flere søskende tilbage.

Ingen endeløs loop, men stadig n påkaldelser af udløseren. Det kunne forklare, hvorfor din stakdybdegrænse blev overskredet, men du kunne rette op på det ved at øge grænsen. Det samme kunne ske igen med en større n .

Som et alternativ kan du erstatte din trigger 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();

Og erstat FK-begrænsningen med en version uden ON DELETE CASCADE . Kodeeksempel:

Nu til DELETE en hel familie, kan man ikke slette forælderen som før (nu forbudt af FK). I stedet for DELETE ethvert barn.

Det burde også være hurtigere.




  1. Oracle XMLTable-henter kolonne fra overordnet node

  2. Sådan udføres rullende opgraderinger til MySQL

  3. Hvordan tilføjer man sekvensnummerkolonne til resultatdata?

  4. PostgreSQL-forespørgselsoutput som en excel-fil