Ok, als je echt de trigger bij update wilt, wat zou je kunnen doen om deze trigger in te stellen als kolomspecifiek, zodat deze niet wordt geactiveerd bij een update naar all_books
, die uw recursie veroorzaakt. Zoiets -
create trigger total2
after update of copy_id
on totalbooks
for each row
execute procedure total1();
Je kunt natuurlijk veranderen welke kolommen de functie activeren, ik heb gewoon copy_id
gekozen want dat is wat je telt.
ECHTER
Als u bijwerkt met een count()
resultaat, je kunt de trigger gewoon op INSERT
. zetten en DELETE
acties. Op deze manier wordt de trigger geactiveerd wanneer de telling verandert, maar wordt deze zelf niet geactiveerd door de update. // EDIT:sinds je sum
is slechts een telling van alle records in copies
, het zal alleen veranderen wanneer een record wordt ingevoegd of bijgewerkt, dus het zou toch geen zin hebben om deze trigger bij update uit te voeren.
EDIT:Ik dacht dat het handig zou zijn om een link toe te voegen aan de CREATE TRIGGER-documentatie . Zie de sectie met het label "gebeurtenis", omdat hierin wordt beschreven hoe kolommen in het evenement moeten worden opgegeven.
BEWERKEN VOOR NIEUWE INFORMATIE:
Gezien wat het klinkt alsof je moet bereiken, denk ik dat je je gegevensontwerp moet heroverwegen. Ik raad je aan een ouder-kindrelatie te gebruiken (elke keer dat je gedeelde gegevens op veel rijen in een tabel cachet omdat ze iets gemeen hebben, dat is een teken dat u in plaats daarvan mogelijk een bovenliggende tabel nodig heeft).
Heb een books
tabel waarin elke rij informatie bevat over één boek (titel, auteur, enz.), en heb dan een copies
tabel waarin elke rij informatie bevat over één exemplaar van een boek (serienummer, laatst uitgecheckt, enz.).
Op die manier is het verkrijgen van het aantal exemplaren zo eenvoudig als SELECT COUNT(*) FROM copies WHERE book_id=[some book id]
.
Als je de telling echt ergens in de cache wilt opslaan, doe dat dan in de books
tafel.
Maak een INSERT OR UPDATE
trigger op copies
dat doet UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=NEW.book_id) WHERE id=NEW.book_id
.
Maak vervolgens een DELETE
trigger op kopieën die UPDATE books SET copy_count=(SELECT COUNT(*) FROM copies WHERE book_id=OLD.book_id) WHERE id=OLD.book_id
De reden voor twee triggers is dat de NEW
variabele is alleen beschikbaar in INSERT
of UPDATE
triggers, en OLD
is alleen beschikbaar in DELETE
triggers. Je zou het allemaal als één trigger kunnen doen, maar dat vereist meer code dan ik hier wilde plaatsen.
Zorg ervoor dat al je triggers AFTER
zijn triggers, anders wordt een nieuw ingevoegde/verwijderde rij niet meegenomen in de telling.