PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Ограничението за дълбочина на стека е надвишено в PostgresQL (след тригер за изтриване)

Засега се случва това:

  1. Изтриване на дете1.
  2. Задейства изтриване на родител.
  3. Изтрива n братя и сестри на дете1 от DELETE CASCADE .
  4. Извиква същия тригер n пъти.
  5. Няма останали повече братя и сестри.

Без безкраен цикъл, но все пак n извиквания на тригера. Това може да обясни защо лимитът на дълбочината на стека е надвишен, но можете да го поправите, като увеличите лимита. Същото може да се случи отново с по-голямо n .

Като алтернатива заменете тригера си с:

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

И заменете ограничението FK с версия без ON DELETE CASCADE . Пример за код:

Сега към DELETE цяло семейство, не можеш да изтриеш родителя както преди (сега е забранено от FK). Вместо DELETE всяко дете.

Трябва да е и по-бързо.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Експортирайте конкретни редове от PostgreSQL таблица като INSERT SQL скрипт

  2. jOOQ вмъкнете в .. където не съществува за Postgres

  3. Свързване на Django и Postgresql с Docker

  4. PostgreSQL параметризиран Order By / Limit във функцията на таблицата

  5. Как да вмъкнете външен ключ в модел на секвелизиране