sql >> Databáze >  >> RDS >> PostgreSQL

postgres. Překročen limit hloubky zásobníku plpgsql

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.



  1. Jak zkopírovat data velké tabulky do jiné tabulky v SQL Server

  2. SQL dotaz pro vyhledávání ve spojeném řetězci

  3. Příklady PLSQL kurzorů – Explicitní, implicitní a referenční kurzory

  4. T-SQL - Aliasing pomocí =versus as