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

PostgreSQL 15执行pg_restore创建索引报错:函数需标记为IMMUTABLE

解决PostgreSQL 15恢复时索引创建报错问题

问题原因

你遇到的报错是因为索引表达式里用到的unaccent函数默认标记为STABLE,而PostgreSQL要求索引表达式中的函数必须是IMMUTABLE——也就是不管数据库环境(比如文本搜索配置)怎么变,函数返回结果都固定,这样才能保证索引数据的一致性。

两种解决方案

方案1:修改unaccent函数的稳定性

直接把unaccent改成IMMUTABLE类型,适合你确定不会更改文本搜索配置的场景:

  1. 先确认当前函数的稳定性:
SELECT proname, provolatile FROM pg_proc WHERE proname = 'unaccent';
  1. 执行修改命令(根据你的函数版本选一个):
-- 不带配置参数的unaccent函数
ALTER FUNCTION public.unaccent(text) IMMUTABLE;

-- 带配置参数的unaccent函数
ALTER FUNCTION public.unaccent(regconfig, text) IMMUTABLE;
  1. 重新运行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 11:09:55