我想這個表情,但我不覺得哪裏不妥我的語法:如何將連接列添加到現有表中?
alter table "TableName"
add column "NameColumn" as concat(ColumnA,ColumnB,ColumnC)
所有三個字段是字符改變。
我想這個表情,但我不覺得哪裏不妥我的語法:如何將連接列添加到現有表中?
alter table "TableName"
add column "NameColumn" as concat(ColumnA,ColumnB,ColumnC)
所有三個字段是字符改變。
什麼是錯的是你要添加列之後的更新:
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的建議是要走的路。如果函數實際上非常複雜(計算量大),並且DML不經常或非高峯時段出現,而讀取頻繁和/或在高峯時段出現,那麼觸發器更可取的一種替代方案是。
你的例子是一個簡單的concat,但它可能是一個概念性的例子,目的是說明這個概念,所以把它看作是值得的。
爲什麼不只是創建一個視圖? – Nicarus
因爲我正在與其他表加入記錄 –