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
相关产品推荐
相关产品推荐

