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

挿入されたフィールドのデータを使用して計算されたデータを別のフィールドに挿入する挿入時のPostgresトリガープロシージャ

    トリガー関数を作成します:

    create or replace function update_calc_column()
      returns trigger
    as
    $$
    begin
      new.x3 := new.x1 + new.x2;
      return new;
    end;
    $$
    language plpgsql;
    

    トリガーを作成します:

    create trigger calc_trigger 
       before insert or update on X
       for each row
       execute procedure update_calc_column();
    

    SQLFiddle: http://sqlfiddle.com/#!15/7ed21/1

    上記は基本的に、マニュアルの例を簡略化したものです
    http://www.postgresql.org/docs/current/static/plpgsql-trigger.html#PLPGSQL-TRIGGER-EXAMPLE

    ただし、そのような派生データを保存することは、通常はお勧めできません。 X1 + X2として定義されている列X3を返すビューを作成するだけです。 -維持するコードがはるかに少なく、同じくらい効率的です(実際にはもっと トリガーのオーバーヘッドを取り除くので効率的です。

    もう1つの(よりエキゾチックな)オプションは、Postgresのオブジェクト指向拡張機能を使用して仮想列を作成することです:

    create or replace function x3(data X) --<< yes, the type of the parameter is the name of the table 
       returns integer
    as
    $$
       select data.x1 + data.x2;
    $$
    language sql;
    

    その後、次を使用できます:

    select x.*, x.x3
    from x;
    

    SQLFiddle: http://sqlfiddle.com/#!15/53acf/1

    ただし、これには、明示的にする必要があるという欠点があります。 x3を選択します 桁。 x.*を使用している場合は表示されません




    1. SQLを使用してPostgresdb8.1のすべてのシーケンスを一覧表示します

    2. Kohana 3.1.4:Database_Exception [2]:mysql_connect():アクセスが拒否されました

    3. MSAccessマルチ結合クエリ

    4. geoDataFrameをMySQLにインポートするにはどうすればよいですか?