De syntaxis zou zijn:
CREATE TRIGGER tr_total_games
AFTER UPDATE OF game_saved ON game_info
FOR EACH ROW
EXECUTE PROCEDURE total_games();
(Zoals gedocumenteerd in de handleiding.)
Maar de hele benadering is dubieus. Het up-to-date houden van aggregaten via trigger is gevoelig voor fouten bij gelijktijdige schrijfbelasting.
En zonder gelijktijdige schrijfbelasting zijn er eenvoudigere oplossingen:gewoon 1 optellen / aftrekken van het huidige totaal ...
Een VIEW
een betrouwbaar alternatief zou zijn. Verwijder de kolom game_collection.total_game_count
helemaal - en misschien de hele tafel game_collection
, die geen ander doel lijkt te hebben. Maak een VIEW
in plaats daarvan:
CREATE VIEW v_game_collection AS
SELECT user_id, count(*) AS total_game_count
FROM game_info
WHERE game_saved
GROUP BY user_id;
Dit retourneert alle gebruikers met ten minste 1 rij in game_info
waar game_saved IS TRUE
(en laat alle andere weg).
Voor zeer grote tabellen wilt u misschien een MATERIALIZED VIEW
of gerelateerde oplossingen om de leesprestaties te verbeteren.