PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Trigger PostgreSQL dopo l'aggiornamento di una colonna specifica

La sintassi sarebbe:

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

(Come documentato nel manuale.)

Ma l'intero approccio è dubbio. Mantenere aggiornati gli aggregati tramite trigger è soggetto a errori in caso di carico di scrittura simultaneo.

E senza carico di scrittura simultaneo, ci sono soluzioni più semplici:basta aggiungere/sottrarre 1 dal totale corrente...

Un VIEW sarebbe un'alternativa affidabile Rimuovi la colonna game_collection.total_game_count del tutto - e forse l'intero tavolo game_collection , che non sembra avere altro scopo. Crea una VIEW invece:

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

Questo restituisce tutti gli utenti con almeno 1 riga in game_info dove game_saved IS TRUE (e omette tutti gli altri).

Per tavoli molto grandi potresti volere una MATERIALIZED VIEW o soluzioni correlate per migliorare le prestazioni di lettura.