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.