sql >> Database >  >> RDS >> PostgreSQL

Stapeldieptelimiet overschreden in PostgresQL (na verwijderingstrigger)

Tot nu toe is dat wat er gebeurt:

  1. Verwijder kind1.
  2. Trigger verwijdering van ouder.
  3. Verwijdert n broers en zussen van kind1 door DELETE CASCADE .
  4. Roept dezelfde trigger n . op keer.
  5. Er zijn geen broers en zussen meer over.

Geen eindeloze lus, maar toch n aanroepen van de trigger. Dat zou kunnen verklaren waarom de limiet van uw stapeldiepte is overschreden, maar u kunt dit oplossen door de limiet te verhogen. Hetzelfde kan opnieuw gebeuren met een grotere n .

Vervang als alternatief uw trigger door:

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

En vervang de FK-beperking door een versie zonder ON DELETE CASCADE . Codevoorbeeld:

Nu, om DELETE een hele familie, je kunt de ouder niet verwijderen zoals voorheen (nu verboden door FK). In plaats daarvan DELETE elk kind.

Zou ook sneller moeten zijn.




  1. Hoe controleer ik of een kolom bestaat voordat deze wordt toegevoegd aan een bestaande tabel in PL/SQL?

  2. Microsoft Access Table Tips – Trucs &Richtlijnen Deel 4

  3. Indexering voor keyset-paginering in mysql

  4. Magento - Kan productprijzen niet opnieuw indexeren - Foreign Key Constraint Fails