PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Przekroczono limit głębokości stosu w PostgresQL (po usunięciu wyzwalacza)

Jak dotąd tak się dzieje:

  1. Usuń dziecko1.
  2. Powoduje usunięcie rodzica.
  3. Usuwa n rodzeństwo dziecka1 przez DELETE CASCADE .
  4. Wywołuje ten sam wyzwalacz n razy.
  5. Nie ma więcej rodzeństwa.

Bez niekończącej się pętli, ale nadal n wywołania wyzwalacza. To może wyjaśniać, dlaczego limit głębokości stosu został przekroczony, ale możesz to naprawić, zwiększając limit. To samo może się powtórzyć z większym n .

Alternatywnie wymień wyzwalacz na:

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

I zastąp ograniczenie FK wersją bez ON DELETE CASCADE . Przykład kodu:

Teraz, DELETE całej rodziny, nie możesz usunąć rodzica jak wcześniej (teraz zabronione przez FK). Zamiast tego DELETE każde dziecko.

Powinno być też szybsze.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak działa justify_interval() w PostgreSQL

  2. Jak zwrócić tablicę jsonb i tablicę obiektów z moich danych?

  3. Sekwencjonuj błąd ładowania Chętnego podczas dołączania powiązanego modelu

  4. Zarejestruj się i uruchom PostgreSQL 9.0 jako usługę Windows

  5. Czy zamówienie według widoku gwarantuje kolejność wyboru?