sql >> データベース >  >> RDS >> PostgreSQL

特定の列の更新後のPostgreSQLトリガー

    構文は次のようになります:

    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が必要になる場合があります。 または読み取りパフォーマンスを向上させるための関連ソリューション。




    1. タイムスタンプに基づいてmysqlの値を比較し、傾向を特定する

    2. Railsのmysqlのインストール-mysql2のインストールエラー:エラー:gemネイティブ拡張のビルドに失敗しました

    3. mysqlをmysqliに変更する方法は?

    4. MariaDBの日時値から秒を引く