私はこの表現をしようとしていますが、私の構文が間違っているところ私は見つけられません:既存のテーブルに連結カラムを追加するにはどうすればよいですか?
alter table "TableName"
add column "NameColumn" as concat(ColumnA,ColumnB,ColumnC)
すべての3つのフィールドは、文字変化しています。間違って何
私はこの表現をしようとしていますが、私の構文が間違っているところ私は見つけられません:既存のテーブルに連結カラムを追加するにはどうすればよいですか?
alter table "TableName"
add column "NameColumn" as concat(ColumnA,ColumnB,ColumnC)
すべての3つのフィールドは、文字変化しています。間違って何
は、列を追加した後に更新をしたいということです。
alter table "TableName" add column "NameColumn" varchar(255); -- or whatever
update "TableName
set "NameColumn" = concat(ColumnA, ColumnB, ColumnC);
Postgresは直接計算列をサポートしていません。さまざまな面倒な回避策がありますが、Erwin Brandstetterの提案のあるものはhereです。
これはおそらく計算されたカラムではないことに注意してください。テーブルへの新しいレコードは、新しい連結に同じ連結を含める必要があります。 (a)自動的に連結し、(b)冗長データを保存しないように、テーブル上のビューを作成することが最善の方法です。 – Nicarus
これは正確にあなたの質問に答えるものではありませんが、私は同じことを達成すると思います。もちろん、トリガーによるオーバーヘッドはありますが、ビューを作成するには不十分です。代わりに、DMLが発生したときにこれを達成する方法がわかりません。
CREATE OR REPLACE FUNCTION tablename_insert_update_trigger()
RETURNS trigger AS
$BODY$
BEGIN
new."NameColumn" = concat(ColumnA, ColumnB, ColumnC);
return new;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
し、そのトリガーを設定し、あなたのテーブルが変更されたときは:
CREATE TRIGGER insert_tablename_trigger
BEFORE INSERT
ON "TableName"
FOR EACH ROW
EXECUTE PROCEDURE tablename_insert_update_trigger();
CREATE TRIGGER update_tablename_trigger
BEFORE UPDATE
ON "TableName"
FOR EACH ROW
EXECUTE PROCEDURE tablename_insert_update_trigger();
言った、私は、ビューのNicarusの提案@ほとんどの場合、移動するための方法だと思います。トリガーが好ましい場合の1つの代替案は、関数が実際にはかなり複雑(計算コストが高い)で、DMLがまれにしか発生しないか、または非ピーク時に発生するのに対し、読み取りは頻繁に、ピーク時に実行されます。
あなたの例は単純なコンカットでしたが、それは概念を説明するための想定上の例だった可能性がありますので、それを価値あるものにしてください。
なぜビューを作成しないのですか? – Nicarus
私は他のテーブルと結合して後でレコードを追加するので、 –