首页 > 解决方案 > 创建索引错误:索引表达式中的函数必须标记为 IMMUTABLE

问题描述

尝试实施对其他问题提出的建议:

问题相关

我编写了此迁移以删除当前索引并创建新索引:

class ChangeIndexes < ActiveRecord::Migration[5.1]
  def change
    remove_index :part_masters, name: "part_masters_on_combo_idx" 

    execute <<-SQL
      CREATE INDEX ON part_masters (lower(unaccent(combo)) text_pattern_ops);
      CREATE INDEX ON locations (lower(unaccent(ubicacion)) text_pattern_ops);     
    SQL
   end
end

问题是我收到了这个错误,我想是因为我使用了 lower 或 unaccent 之类的函数来创建索引:

PG::InvalidObjectDefinition: ERROR: functions in index expression must be marked IMMUTABLE

标签: ruby-on-railspostgresqlactiverecord

解决方案


如果将来有人发现它有用,用户@laurenz-albe 在引用的问题中提供了该问题的解决方案,只需将函数 unaccent 创建为自定义 pg 函数:

CREATE FUNCTION my_unaccent(text) RETURNS text LANGUAGE SQL IMMUTABLE AS 
'SELECT unaccent($1)';

推荐阅读