我正在向表中添加一些列,并希望生成一个将它们组合在一起的列,以便用于唯一索引.当我try 添加该列时,出现错误ERROR: generation expression is not immutable.

我遵循从this question开始的解决方案,并专门使用CASE||进行字符串连接,它们应该是immutable.

ALTER TABLE tag
  ADD COLUMN prefix VARCHAR(4) NOT NULL,
  ADD COLUMN middle BIGINT NOT NULL,
  ADD COLUMN postfix VARCHAR(4), -- nullable
  -- VARCHAR size is 4 prefix + 19 middle + 4 postfix + 2 delimiter
  ADD COLUMN tag_id VARCHAR(29) NOT NULL GENERATED ALWAYS AS
    (CASE WHEN postfix IS NULL THEN prefix || '-' || middle
          ELSE prefix || '-' || middle || '-' || postfix
          END
    ) STORED;
CREATE UNIQUE INDEX unq_tag_tag_id ON tag(tag_id);

postgres mailing list强中,其中一位贡献者澄清说:

整数到文本强制,[...]并不一定 不可变的

然而,他并不共享一个不变的从整数到文本的函数.有没有人知道有没有?

推荐答案

14.1中的测试表明,原因是在串联中将bigint列隐含地转换为text(即使没有case)

EXPLICITE强制转换为text不会产生错误-middle::text

ALTER TABLE tag
  ADD COLUMN prefix VARCHAR(4) NOT NULL,
  ADD COLUMN middle BIGINT NOT NULL,
  ADD COLUMN postfix VARCHAR(4), -- nullable
  -- VARCHAR size is 4 prefix + 19 middle + 4 postfix + 2 delimiter
  ADD COLUMN tag_id VARCHAR(29) NOT NULL GENERATED ALWAYS AS
    (CASE WHEN postfix IS NULL THEN prefix || '-' || middle::text
          ELSE prefix || '-' || middle::text || '-' || postfix
          END
    ) STORED;

Postgresql相关问答推荐

为什么在使用PostGIS时,英国郡的几何图形会出现在几内亚湾?

锁定模式与PostgreSQL中的另一种锁定模式冲突到底是什么意思?

在rust中,有什么方法可以从sqlx::query_with中返回rows_infected以及行本身?

自左联接的POSTGIS更新

使用Helm设置PostgreSQL配置

PostgreSQL 中的 DATEADD 等效项

从 sql 查询 postgres 9.4 创建嵌套 json

如何 Select 列值为空的行?

如果 Column1 不为空,则按 Column1 排序,否则按 Column2 排序

当记录包含 json 或字符串的混合时,如何防止 Postgres 中的invalid input syntax for type json

在 PL/pgSQL 中声明行类型变量

如何为查询执行设置语句超时

你如何在postgresql中做mysqldump?

POSTGRESQL 中的 CHARINDEX (SQL SERVER) 相似函数是什么?

PGError:错误: column of relation does not exist

Postgresql varchar 是否使用 unicode 字符长度或 ASCII 字符长度计算?

PostgreSQL 中跨多个表的索引

如何从 PostgreSQL 中的 Json 数组中获取元素

Postgresql 对象 ID 和元组

PostgreSQL:如何解决numeric field overflow问题