Dobře, pokud opravdu chcete spouštěč při aktualizaci, co můžete udělat, nastavte toto pravidlo jako specifické pro sloupec, aby se nespouštělo při aktualizaci na all_books
, což způsobuje vaši rekurzi. Něco takového -
create trigger total2
after update of copy_id
on totalbooks
for each row
execute procedure total1();
Samozřejmě můžete změnit, které sloupce spouštějí funkci, já jsem zvolil pouze copy_id
protože to je to, co počítáte.
OVŠEM
Pokud aktualizujete pomocí count()
výsledkem je, že stačí umístit spouštěč na INSERT
a DELETE
akce. Tímto způsobem se spouštěč spustí, když se počet změní, ale nebude sám spuštěn aktualizací. // EDIT:Od vašeho sum
je pouze počet všech záznamů v copies
, změní se pouze při vložení nebo aktualizaci záznamu, takže spuštění tohoto spouštěče při aktualizaci by stejně nedávalo smysl.
EDIT:Myslel jsem, že by bylo užitečné přidat odkaz na CREATE Dokumentace TRIGGER . Viz část označená „událost“, protože zde je podrobně popsáno, jak specifikovat sloupce v události.
UPRAVTE PRO NOVÉ INFORMACE:
Vzhledem k tomu, co zní, že musíte dosáhnout, si myslím, že musíte přehodnotit svůj návrh dat, doporučuji vám použít vztah rodič-dítě (pokaždé, když ukládáte sdílená data do mezipaměti na mnoha řádcích v tabulce, protože sdílejí něco společného, je známkou toho, že možná budete místo toho potřebovat nadřazenou tabulku).
Mít books
tabulka, kde každý řádek obsahuje informace o jedné knize (název, autor atd.), a poté má copies
tabulka, kde každý řádek obsahuje informace o jedné kopii knihy (sériové číslo, poslední vypůjčení atd.).
Získání počtu kopií je tak jednoduché jako SELECT COUNT(*) FROM copies WHERE book_id=[some book id]
.
Pokud opravdu chcete počet někde uložit do mezipaměti, udělejte to v books
stůl.
Vytvořte INSERT OR UPDATE
spouštět při copies
to dělá UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=NEW.book_id) WHERE id=NEW.book_id
.
Poté vytvořte DELETE
spouštět u kopií, které UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=OLD.book_id) WHERE id=OLD.book_id
Důvodem pro dva spouštěče je, že NEW
proměnná je dostupná pouze v INSERT
nebo UPDATE
spouštěče a OLD
je k dispozici pouze v DELETE
spouštěče. Mohli byste to udělat všechno jako jeden spouštěč, ale to vyžaduje více kódu, než jsem sem chtěl vložit.
Ujistěte se, že všechny vaše spouštěče jsou AFTER
spouštěče, jinak nebude nově vložený/smazaný řádek při počítání zohledněn.