Добре, ако наистина искате тригера при актуализация, какво можете да направите, задайте този тригер като специфичен за колона, така че да не се задейства при актуализация на 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
тригери или в противен случай нововмъкнат/изтрит ред няма да бъде взет предвид при преброяването.