如何将连接列添加到现有 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,则触发器更可取。

你的例子是一个简单的连接,但它可能是一个为了说明这个概念的概念性例子,所以把它当作它的价值。