2016-08-03 19 views
0

私はこの表現をしようとしていますが、私の構文が間違っているところ私は見つけられません:既存のテーブルに連結カラムを追加するにはどうすればよいですか?

alter table "TableName" 
add column "NameColumn" as concat(ColumnA,ColumnB,ColumnC) 

すべての3つのフィールドは、文字変化しています。間違って何

+5

なぜビューを作成しないのですか? – Nicarus

+0

私は他のテーブルと結合して後でレコードを追加するので、 –

答えて

1

は、列を追加した後に更新をしたいということです。

alter table "TableName" add column "NameColumn" varchar(255); -- or whatever 

update "TableName 
    set "NameColumn" = concat(ColumnA, ColumnB, ColumnC); 

Postgresは直接計算列をサポートしていません。さまざまな面倒な回避策がありますが、Erwin Brandstetterの提案のあるものはhereです。

+3

これはおそらく計算されたカラムではないことに注意してください。テーブルへの新しいレコードは、新しい連結に同じ連結を含める必要があります。 (a)自動的に連結し、(b)冗長データを保存しないように、テーブル上のビューを作成することが最善の方法です。 – Nicarus

0

これは正確にあなたの質問に答えるものではありませんが、私は同じことを達成すると思います。もちろん、トリガーによるオーバーヘッドはありますが、ビューを作成するには不十分です。代わりに、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がまれにしか発生しないか、または非ピーク時に発生するのに対し、読み取りは頻繁に、ピーク時に実行されます。

あなたの例は単純なコンカットでしたが、それは概念を説明するための想定上の例だった可能性がありますので、それを価値あるものにしてください。

関連する問題