Syntaxen skulle vara:
CREATE TRIGGER tr_total_games
AFTER UPDATE OF game_saved ON game_info
FOR EACH ROW
EXECUTE PROCEDURE total_games();
(Som dokumenterat i manualen.)
Men hela tillvägagångssättet är tveksamt. Att hålla aggregat uppdaterade via utlösaren är benägna att få fel under samtidig skrivbelastning.
Och utan samtidig skrivbelastning finns det enklare lösningar:lägg bara till / subtrahera 1 från den aktuella summan ...
En VIEW
skulle vara ett pålitligt alternativ. Ta bort kolumnen game_collection.total_game_count
helt och hållet - och kanske hela tabellen game_collection
, som inte verkar ha något annat syfte. Skapa en VIEW
istället:
CREATE VIEW v_game_collection AS
SELECT user_id, count(*) AS total_game_count
FROM game_info
WHERE game_saved
GROUP BY user_id;
Detta returnerar alla användare med minst 1 rad i game_info
där game_saved IS TRUE
(och utelämnar alla andra).
För mycket stora bord kanske du vill ha en MATERIALIZED VIEW
eller relaterade lösningar för att förbättra läsprestanda.