如何将连接列添加到现有 table?
How do I add a concatenated column to existing table?
我正在尝试这个表达式,但我没有发现我的语法哪里有问题:
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 建议。
这并不能准确回答您的问题,但我认为它可以完成同样的事情。当然,触发器会产生开销,但如果没有创建视图,我不确定在发生 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;
然后在您的 table 修改时设置触发器:
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 不经常发生或在非高峰时段发生,而读取在高峰时段频繁发生 and/or,则触发器更可取。
你的例子是一个简单的连接,但它可能是一个为了说明这个概念的概念性例子,所以把它当作它的价值。
我正在尝试这个表达式,但我没有发现我的语法哪里有问题:
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 建议。
这并不能准确回答您的问题,但我认为它可以完成同样的事情。当然,触发器会产生开销,但如果没有创建视图,我不确定在发生 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;
然后在您的 table 修改时设置触发器:
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 不经常发生或在非高峰时段发生,而读取在高峰时段频繁发生 and/or,则触发器更可取。
你的例子是一个简单的连接,但它可能是一个为了说明这个概念的概念性例子,所以把它当作它的价值。