構文は次のようになります:
CREATE TRIGGER tr_total_games
AFTER UPDATE OF game_saved ON game_info
FOR EACH ROW
EXECUTE PROCEDURE total_games();
しかし、全体的なアプローチは疑わしいです。トリガーを介してアグリゲートを最新の状態に保つと、同時書き込みロードでエラーが発生しやすくなります。
また、同時書き込み負荷がない場合は、より簡単な解決策があります。現在の合計から1を加算/減算するだけです...
VIEW
信頼できる代替手段になります。列game_collection.total_game_count
を削除します 完全に-そしておそらくテーブル全体game_collection
、他の目的はないようです。 VIEW
を作成します 代わりに:
CREATE VIEW v_game_collection AS
SELECT user_id, count(*) AS total_game_count
FROM game_info
WHERE game_saved
GROUP BY user_id;
これにより、game_info
に少なくとも1行あるすべてのユーザーが返されます ここで、game_saved IS TRUE
(そして他のすべてを省略します。)
非常に大きなテーブルの場合は、MATERIALIZED VIEW
が必要になる場合があります。
または読み取りパフォーマンスを向上させるための関連ソリューション。