61

Postgresql で、テーブルがTあり、その列の 1 つがC1.

新しいレコードがテーブルに追加されたときに関数をトリガーしたいT。関数は、新しいレコードの column の値をチェックし、C1null/空の場合はその値を に設定する必要があります'X'

これは可能ですか?

4

2 に答える 2

10

可能ですが、代わりに列にデフォルトの制約を設定する方がよいでしょう。次のようなテーブルを作成する場合:

create table mytable as (
    C1 thetype not null default X
);

これは、テーブルに行を追加し、C1 の値を指定しない場合、代わりに X が使用されることを示しています。not null は必要ありませんが、必要なものであると仮定して、更新がその列を null にしないようにします。

編集:これは、定数 X に対してのみ機能します。コメントから、2 つの解決策が考えられるようです。

トリガーを使用すると、次のようになります。

create function update_row_trigger() returns trigger as $$
begin
    if new.C1 is NULL then
        new.C1 := X;
    end if;
    return new;
end
$$ language plpgsql;

create trigger mytrigger before insert on mytable for each row execute procedure update_row_trigger();

トリガー関数のnew変数は特別で、挿入される行を表します。トリガーをトリガーとして指定するbefore insertと、テーブルに書き込まれる前に行を変更できます。

2 番目の解決策は、Postgres が通常とは異なる方法で定義する計算列を使用することです。

create or replace function C1(row mytable) returns columntype immutable as $$
begin
    return X; -- where X is an expression using values from `row`
end
$$ language plpgsql;

これにより、テーブルの行を取得して値を返す関数が作成されます。 を使用して呼び出すことができます。ただし、次のことができることを意味します。

select
    *,
    t.C1
from
    mytable t;

関数が不変であることの宣言はオプションですが、「列」にインデックスを付けたい場合は必要です。次のように、この列にインデックスを付けることができます。

create index on mytable (C1(mytable));
于 2013-04-19T10:16:54.397 に答える