PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL-Trigger nach Aktualisierung einer bestimmten Spalte

Die Syntax wäre:

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

(Wie im Handbuch dokumentiert.)

Aber der ganze Ansatz ist zweifelhaft. Das Aktualisieren von Aggregaten über Trigger ist bei gleichzeitiger Schreiblast fehleranfällig.

Und ohne gleichzeitige Schreiblast gibt es einfachere Lösungen:addieren / subtrahieren Sie einfach 1 von der aktuellen Summe ...

Ein VIEW wäre eine zuverlässige Alternative. Entfernen Sie die Spalte game_collection.total_game_count insgesamt - und vielleicht die ganze Tabelle game_collection , die keinen anderen Zweck zu haben scheint. Erstellen Sie eine VIEW stattdessen:

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

Dies gibt alle Benutzer mit mindestens 1 Zeile in game_info zurück wobei game_saved IS TRUE (und lässt alle anderen weg).

Für sehr große Tabellen möchten Sie vielleicht eine MATERIALIZED VIEW oder verwandte Lösungen zur Verbesserung der Leseleistung.