You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL 13中如何从varchar/text列生成sha256列?

解决PostgreSQL生成列的“generation expression is not immutable”错误

你猜的没错,问题出在convert_to函数的稳定性上——它属于STABLE级别的函数,而生成列要求表达式必须是IMMUTABLE(不可变)的,因为PostgreSQL需要确保相同输入永远得到相同输出,才能安全预存生成值。

要解决这个问题,你可以自定义一个标记为IMMUTABLE的专用转换函数,由于你固定使用LATIN1编码,这个转换逻辑是完全确定的:

首先创建自定义函数:

CREATE OR REPLACE FUNCTION text_to_latin1_bytea(t text)
RETURNS bytea
LANGUAGE sql
IMMUTABLE
AS $$
SELECT convert_to(t, 'LATIN1');
$$;

然后用这个函数创建目标表:

CREATE TABLE cached (
  text VARCHAR NOT NULL,
  text_hash BYTEA GENERATED ALWAYS AS (sha256(text_to_latin1_bytea(text))) STORED PRIMARY KEY
);

这个方案完全满足你的要求:既没有使用text::bytea,也不需要触发器,纯生成列实现。自定义函数明确标记为IMMUTABLE,PostgreSQL会认可它符合生成列的要求——对于相同的text输入,它永远返回相同的LATIN1编码bytea结果。

内容的提问来源于stack exchange,提问作者Attila Kun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 09:16:34