Postgres(Supabase)中文本数组生成tsvector列报错:表达式非不可变
解决Postgres生成tsvector列时的「immutable」报错问题
问题原因
生成列要求计算表达式必须是**immutable(不可变)**的。你直接使用to_tsvector(array_to_string(...))时,Postgres会默认依赖数据库的default_text_search_config配置,而这个配置是可以被修改的(比如通过ALTER DATABASE命令),因此该表达式被判定为非immutable,导致创建失败。
解决方案
给to_tsvector显式指定固定的文本搜索配置(比如对应语言的配置),让整个表达式满足immutable要求。
示例SQL
假设你的表名为products,短标题数组列是short_titles text[],要添加生成列short_titles_tsv tsvector,可以执行:
ALTER TABLE products ADD COLUMN short_titles_tsv tsvector GENERATED ALWAYS AS ( to_tsvector('english', array_to_string(short_titles, ' ')) ) STORED;
- 如果需要支持中文,将
'english'替换为对应的配置,比如'pg_catalog.chinese'(Supabase已预装中文分词扩展) - 分隔符可以自定义(比如
' | '),只要是固定字符串就不影响immutable属性
验证方法
可以通过以下SQL确认显式指定配置的to_tsvector是immutable的:
SELECT proname, provolatile FROM pg_proc WHERE proname = 'to_tsvector' AND proargtypes[0]::regtype = 'regconfig';
结果中provolatile字段显示i,代表该函数是immutable类型,符合生成列的要求。
内容的提问来源于stack exchange,提问作者Kvetoslav
相关产品推荐
相关产品推荐

