2016-08-03 45 views
0

我想這個表情,但我不覺得哪裏不妥我的語法:如何將連接列添加到現有表中?

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

所有三個字段是字符改變。

+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的建議是要走的路。如果函數實際上非常複雜(計算量大),並且DML不經常或非高峯時段出現,而讀取頻繁和/或在高峯時段出現,那麼觸發器更可取的一種替代方案是。

你的例子是一個簡單的concat,但它可能是一個概念性的例子,目的是說明這個概念,所以把它看作是值得的。