PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Déclencheur PostgreSQL après la mise à jour d'une colonne spécifique

La syntaxe serait :

CREATE TRIGGER tr_total_games 
AFTER UPDATE OF game_saved ON game_info
FOR EACH ROW 
EXECUTE PROCEDURE total_games();

(Comme documenté dans le manuel.)

Mais toute l'approche est douteuse. La mise à jour des agrégats via le déclencheur est sujette à des erreurs en cas de charge d'écriture simultanée.

Et sans charge d'écriture simultanée, il existe des solutions plus simples :il suffit d'ajouter/soustraire 1 au total actuel...

Une VIEW serait une alternative fiable. Supprimez la colonne game_collection.total_game_count tout à fait - et peut-être toute la table game_collection , qui ne semble pas avoir d'autre but. Créer une VIEW à la place :

CREATE VIEW v_game_collection AS
SELECT user_id, count(*) AS total_game_count
FROM   game_info
WHERE  game_saved
GROUP  BY user_id;

Cela renvoie tous les utilisateurs avec au moins 1 ligne dans game_infogame_saved IS TRUE (et omet tous les autres).

Pour les très grandes tables, vous voudrez peut-être une MATERIALIZED VIEW ou des solutions connexes pour améliorer les performances de lecture.