Postgresql で、テーブルがT
あり、その列の 1 つがC1
.
新しいレコードがテーブルに追加されたときに関数をトリガーしたいT
。関数は、新しいレコードの column の値をチェックし、C1
null/空の場合はその値を に設定する必要があります'X'
。
これは可能ですか?
Postgresql で、テーブルがT
あり、その列の 1 つがC1
.
新しいレコードがテーブルに追加されたときに関数をトリガーしたいT
。関数は、新しいレコードの column の値をチェックし、C1
null/空の場合はその値を に設定する必要があります'X'
。
これは可能ですか?
可能ですが、代わりに列にデフォルトの制約を設定する方がよいでしょう。次のようなテーブルを作成する場合:
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));