Ok, hvis du virkelig vil have triggeren ved opdatering, hvad du kunne gøre, så sæt denne trigger som kolonnespecifik, så den ikke udløses ved en opdatering til all_books
, som forårsager din rekursion. Noget som dette -
create trigger total2
after update of copy_id
on totalbooks
for each row
execute procedure total1();
Du kan selvfølgelig ændre hvilke kolonner der udløser funktionen, jeg valgte bare copy_id
fordi det er det, du tæller.
DOG
Hvis du opdaterer med en count()
resultat, kan du bare sætte udløseren på INSERT
og DELETE
handlinger. På denne måde udløses triggeren, når tællingen ændres, men den udløses ikke selv af opdateringen. // EDIT:Siden din sum
er kun en optælling af alle poster i copies
, det vil kun ændre sig, når en post er indsat eller opdateret, så det ville alligevel ikke give mening at køre denne trigger ved opdatering.
EDIT:Jeg tænkte, at det ville være nyttigt at tilføje et link til CREATE TRIGGER-dokumentation . Se afsnittet mærket "begivenhed", fordi dette beskriver, hvordan du angiver kolonner i begivenheden.
REDIGER TIL NYE OPLYSNINGER:
I betragtning af, hvad det lyder som om, du skal opnå, tror jeg, du skal genoverveje dit datadesign. Jeg foreslår, at du bruger en forældre-barn-relation (hver gang du cachelagrer delte data på mange rækker i en tabel, fordi de deler noget til fælles, at er et tegn på, at du måske har brug for et forældrebord i stedet).
Har en books
tabel, hvor hver række er information om én bog (titel, forfatter osv.), og derefter har en copies
tabel, hvor hver række indeholder oplysninger om et eksemplar af en bog (serienummer, sidst tjekket ud osv.).
På den måde er det så enkelt at få antallet af kopier som SELECT COUNT(*) FROM copies WHERE book_id=[some book id]
.
Hvis du virkelig vil cache tællingen et sted, så gør det på books
bord.
Opret en INSERT OR UPDATE
trigger på copies
der gør UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=NEW.book_id) WHERE id=NEW.book_id
.
Opret derefter en DELETE
trigger på kopier, der gør UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=OLD.book_id) WHERE id=OLD.book_id
Årsagen til to triggere er, at NEW
variabel er kun tilgængelig i INSERT
eller UPDATE
triggere og OLD
er kun tilgængelig i DELETE
udløser. Du kan gøre det hele som én udløser, men det kræver mere kode, end jeg ville sætte her.
Sørg for, at alle dine triggere er AFTER
udløses, ellers vil en nyligt indsat/slettet række ikke blive taget med i tællingen.