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.