PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

postgr. Plpgsql-Stapeltiefenlimit überschritten

Ok, wenn Sie wirklich möchten, dass der Auslöser aktualisiert wird, können Sie diesen Auslöser als spaltenspezifisch festlegen, sodass er bei einer Aktualisierung von all_books nicht ausgelöst wird , was Ihre Rekursion verursacht. Etwas in der Art -

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

Natürlich können Sie ändern, welche Spalten die Funktion auslösen, ich habe einfach copy_id gewählt denn darauf zählst du.

JEDOCH

Wenn Sie mit einem count() aktualisieren Als Ergebnis können Sie den Trigger einfach auf INSERT setzen und DELETE Aktionen. Auf diese Weise wird der Trigger ausgelöst, wenn sich der Zähler ändert, wird aber selbst nicht durch das Update ausgelöst. // BEARBEITEN:Da Ihre sum ist nur eine Zählung aller Datensätze in copies , es wird sich nur ändern, wenn ein Datensatz eingefügt oder aktualisiert wird, daher wäre es sowieso nicht sinnvoll, diesen Trigger bei der Aktualisierung auszuführen.

BEARBEITEN:Ich dachte, es wäre nützlich, einen Link zum CREATE hinzuzufügen TRIGGER-Dokumentation . Sehen Sie sich den Abschnitt mit der Bezeichnung "Ereignis" an, da dieser detailliert beschreibt, wie Spalten im Ereignis angegeben werden.

BEARBEITEN FÜR NEUE INFORMATIONEN:

Angesichts dessen, was Sie erreichen müssen, denke ich, dass Sie Ihr Datendesign überdenken müssen. Ich schlage vor, dass Sie eine Eltern-Kind-Beziehung verwenden (immer wenn Sie gemeinsame Daten in vielen Zeilen in einer Tabelle zwischenspeichern, weil sie etwas gemeinsam haben, das ist ein Zeichen dafür, dass Sie möglicherweise stattdessen eine übergeordnete Tabelle benötigen).

Haben Sie books Tabelle, in der jede Zeile Informationen zu einem Buch enthält (Titel, Autor usw.), und dann einen copies enthält Tabelle, in der jede Zeile Informationen über ein Exemplar eines Buches enthält (Seriennummer, zuletzt ausgeliehen usw.).

Auf diese Weise ist das Abrufen der Anzahl der Exemplare so einfach wie SELECT COUNT(*) FROM copies WHERE book_id=[some book id] .

Wenn Sie die Zählung wirklich irgendwo zwischenspeichern möchten, tun Sie dies in den books Tisch.

Erstellen Sie ein INSERT OR UPDATE Trigger auf copies das macht UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=NEW.book_id) WHERE id=NEW.book_id .

Erstellen Sie dann ein DELETE Trigger auf Kopien, die UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=OLD.book_id) WHERE id=OLD.book_id ausführen

Der Grund für zwei Trigger ist, dass NEW Variable ist nur in INSERT verfügbar oder UPDATE Auslöser und OLD ist nur in DELETE verfügbar löst aus. Sie könnten alles als einen Trigger ausführen, aber das erfordert mehr Code, als ich hier einfügen wollte.

Stellen Sie sicher, dass alle Ihre Auslöser AFTER sind Trigger, oder eine neu eingefügte/gelöschte Zeile wird bei der Zählung nicht berücksichtigt.