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

postgres. plpgsql ограничението за дълбочина на стека е надвишено

Добре, ако наистина искате тригера при актуализация, какво можете да направите, задайте този тригер като специфичен за колона, така че да не се задейства при актуализация на all_books , което причинява вашата рекурсия. Нещо подобно -

create trigger total2
after update of copy_id
on totalbooks
for each row
execute procedure total1();

Разбира се, можете да промените кои колони задействат функцията, аз просто избрах copy_id защото това е, което броите.

ОБАЧЕ

Ако актуализирате с count() резултат, можете просто да поставите тригера на INSERT и DELETE действия. По този начин тригерът ще се задейства, когато броят се промени, но самият той няма да бъде задействан от актуализацията. // РЕДАКТИРАНЕ:Тъй като вашата sum е само брой на всички записи в copies , то ще се промени само когато се вмъкне или актуализира запис, така че изпълнението на този тригер при актуализация така или иначе няма да има смисъл.

РЕДАКТИРАНЕ:Реших, че би било полезно да добавя връзка към CREATE Документация на TRIGGER . Вижте раздела с надпис „събитие“, тъй като той описва как да посочите колони в събитието.

РЕДАКТИРАНЕ ЗА НОВА ИНФОРМАЦИЯ:

Като се има предвид това, което звучи като че трябва да постигнете, мисля, че трябва да преосмислите дизайна на вашите данни, предлагам да използвате връзка родител-дете (Винаги, когато кеширате споделени данни на много редове в таблица, защото те споделят нещо общо, това е знак, че вместо това може да се нуждаете от родителска таблица).

Имате books таблица, където всеки ред е информация за една книга (заглавие, автор и т.н.), а след това има copies таблица, в която всеки ред съдържа информация за едно копие на книга (сериен номер, последна изписване и т.н.).

По този начин получаването на броя на копията е толкова просто, колкото SELECT COUNT(*) FROM copies WHERE book_id=[some book id] .

Ако наистина искате да кеширате броя някъде, направете го в books маса.

Създайте INSERT OR UPDATE задейства върху copies това прави UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=NEW.book_id) WHERE id=NEW.book_id .

След това създайте DELETE задейства върху копия, което прави UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=OLD.book_id) WHERE id=OLD.book_id

Причината за два тригера е, че NEW променлива е достъпна само в INSERT или UPDATE тригери и OLD е достъпно само в DELETE задейства. Можете да направите всичко като един тригер, но това изисква повече код, отколкото исках да поставя тук.

Уверете се, че всичките ви тригери са AFTER тригери или в противен случай нововмъкнат/изтрит ред няма да бъде взет предвид при преброяването.



  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 12

  2. Как да използвате PreparedStatement и търсене без учет на главни и малки букви

  3. Изключение на Geodjango при импортиране на django.contrib.gis.gdal:OSError:/usr/lib/libgdal.so.1:недефиниран символ:sqlite3_column_table_name

  4. Може ли ограничение INITIALLY DEFERRED да бъде дефинирано с помощта на анотация на Hibernate?

  5. Как да се свържете в мрежа между Docker изображения по време на изграждане?