Ok, jeśli naprawdę chcesz wyzwalacz przy aktualizacji, co możesz zrobić, ustaw ten wyzwalacz jako specyficzny dla kolumny, aby nie był uruchamiany przy aktualizacji all_books
, który powoduje twoją rekurencję. Coś takiego -
create trigger total2
after update of copy_id
on totalbooks
for each row
execute procedure total1();
Oczywiście możesz zmienić, które kolumny uruchamiają funkcję, po prostu wybrałem copy_id
bo to właśnie liczysz.
JEDNAK
Jeśli aktualizujesz za pomocą count()
wynik, możesz po prostu umieścić wyzwalacz na INSERT
i DELETE
działania. W ten sposób wyzwalacz zostanie uruchomiony, gdy zmieni się liczba, ale sam nie zostanie wyzwolony przez aktualizację. // EDYCJA:Od Twojej sum
to tylko liczba wszystkich rekordów w copies
, zmieni się tylko po wstawieniu lub zaktualizowaniu rekordu, więc uruchomienie tego wyzwalacza podczas aktualizacji i tak nie miałoby sensu.
EDYCJA:Pomyślałem, że warto dodać link do CREATE Dokumentacja TRIGGERa . Zobacz sekcję o nazwie „zdarzenie”, ponieważ zawiera ona szczegółowe informacje na temat określania kolumn w zdarzeniu.
EDYTUJ W CELU NOWYCH INFORMACJI:
Biorąc pod uwagę to, co brzmi jak musisz osiągnąć, myślę, że musisz przemyśleć swój projekt danych, sugeruję użycie relacji rodzic-dziecko (za każdym razem, gdy buforujesz współdzielone dane w wielu wierszach w tabeli, ponieważ mają one coś wspólnego, że to znak, że możesz potrzebować tabeli nadrzędnej).
Mieć books
tabela, w której każdy wiersz zawiera informacje o jednej książce (tytule, autorze itp.), a następnie zawiera copies
tabela, w której każdy wiersz zawiera informacje o jednym egzemplarzu książki (numer seryjny, ostatnie wyewidencjonowanie itp.).
W ten sposób uzyskanie liczby kopii jest tak proste, jak SELECT COUNT(*) FROM copies WHERE book_id=[some book id]
.
Jeśli naprawdę chcesz gdzieś zapisać licznik, zrób to w books
stół.
Utwórz INSERT OR UPDATE
wyzwalacz na copies
to robi UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=NEW.book_id) WHERE id=NEW.book_id
.
Następnie utwórz DELETE
wyzwalacz dla kopii, które wykonują UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=OLD.book_id) WHERE id=OLD.book_id
Powodem dwóch wyzwalaczy jest to, że NEW
zmienna jest dostępna tylko w INSERT
lub UPDATE
wyzwalacze i OLD
jest dostępny tylko w DELETE
wyzwalacze. Możesz zrobić to wszystko jako jeden wyzwalacz, ale wymaga to więcej kodu, niż chciałem tutaj umieścić.
Upewnij się, że wszystkie wyzwalacze są AFTER
wyzwalacze, w przeciwnym razie nowo wstawiony/usunięty wiersz nie zostanie uwzględniony w liczniku.