sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL-trigger na update van een specifieke kolom

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.




  1. Back-up van MySQL-gebruikers

  2. Decimale waarden in SQL voor het delen van resultaten

  3. ORACLE (11.2.0.1.0) - Recursieve CTE met een datumuitdrukking

  4. MySQL SELECT-instructie waarbij de waarde in de array staat