sql >> Databáze >  >> RDS >> PostgreSQL

Limit hloubky zásobníku překročen v PostgresQL (po smazání spouštěče)

Zatím se to stalo:

  1. Smazat dítě1.
  2. Spustí smazání rodiče.
  3. Smaže n sourozenci dítěte1 pomocí DELETE CASCADE .
  4. Volá stejný spouštěč n krát.
  5. Už žádní sourozenci nezůstali.

Žádná nekonečná smyčka, ale stále n vyvolání spouštěče. To by mohlo vysvětlovat, proč byl překročen váš limit hloubky zásobníku, ale můžete to opravit zvýšením limitu. Totéž se může opakovat s větším n .

Alternativně nahraďte spouštěč:

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

A nahradit omezení FK verzí bez ON DELETE CASCADE . Příklad kódu:

Nyní DELETE celou rodinu, nemůžete smazat rodiče jako dříve (nyní to FK zakázal). Místo toho DELETE jakékoli dítě.

Měl by být také rychlejší.




  1. PostgreSQL:GIN nebo GiST indexy?

  2. Jak najdu duplikáty ve více sloupcích?

  3. Použití PostgresSQL INTERVAL v SQLAlchemy, kde je doba trvání dynamicky uložena v DB a není parametrem

  4. Existují nějaká úskalí / věci, které potřebujete vědět při přechodu z MyISAM na InnoDB