PostgreSQL 15执行pg_restore创建索引报错:函数需标记为IMMUTABLE
解决PostgreSQL 15恢复时索引创建报错问题
问题原因
你遇到的报错是因为索引表达式里用到的unaccent函数默认标记为STABLE,而PostgreSQL要求索引表达式中的函数必须是IMMUTABLE——也就是不管数据库环境(比如文本搜索配置)怎么变,函数返回结果都固定,这样才能保证索引数据的一致性。
两种解决方案
方案1:修改unaccent函数的稳定性
直接把unaccent改成IMMUTABLE类型,适合你确定不会更改文本搜索配置的场景:
- 先确认当前函数的稳定性:
SELECT proname, provolatile FROM pg_proc WHERE proname = 'unaccent';
- 执行修改命令(根据你的函数版本选一个):
-- 不带配置参数的unaccent函数 ALTER FUNCTION public.unaccent(text) IMMUTABLE; -- 带配置参数的unaccent函数 ALTER FUNCTION public.unaccent(regconfig, text) IMMUTABLE;
- 重新运行
pg_restore或者直接执行创建索引的语句。
方案2:索引表达式显式指定文本搜索配置
如果不想修改函数本身,就在索引语句里固定使用的unaccent配置,这样表达式整体会被判定为IMMUTABLE,更安全:
CREATE INDEX inventory_package__name_index ON public.inventory_package USING gin (public.unaccent('public.unaccent'::regconfig, (name)::text) public.gin_trgm_ops);
替换原有的创建索引语句后,再执行恢复或索引创建操作。
注意事项
- 方案1有风险:如果后续修改了unaccent的文本搜索配置,索引里的数据会和实际计算结果不一致,需要重建索引。
- 方案2更稳妥,避免了配置变化对索引的影响。
内容的提问来源于stack exchange,提问作者fueggit
相关产品推荐
相关产品推荐

