错误"索引表达式中的函数必须标记为IMMUTABLE",而不是时间戳

时间:2017-07-26 12:04:30

标签: postgresql postgres-9.6

我试图创建以下索引;

CREATE INDEX idx_concat_paostartno_paostartsuff ON 
    dmv_os_addbase_residential (concat(pao_start_number || pao_start_suffix));

我得到错误;

  

错误:索引表达式中的函数必须标记为IMMUTABLE`

我认为这是类型的混合,因为pao_start_number是类型bigintpao_start_suffixvarchar。我试图解决;

CREATE INDEX idx_concat_paostartno_paostartsuff ON  
  dmv_os_addbase_residential (concat((pao_start_number :: text) || pao_start_suffix))

但同样的错误。

我是否正确识别错误原因以及如何解决? 我正在使用Postgres 9.6

2 个答案:

答案 0 :(得分:2)

你可能想要

if (requestCode == REQUEST_PERMISSION_SETTING) {
        if (ActivityCompat.checkSelfPermission(TestActivity.this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
            proceedAfterPermission();
        }
    }

此索引只能用于

等查询
CREATE INDEX idx_concat_paostartno_paostartsuff
   ON dmv_os_addbase_residential ((pao_start_number || pao_start_suffix));

其中SELECT * FROM dmv_os_addbase_residential WHERE pao_start_number || pao_start_suffix <operator> <constant>; <operator>=<<=>之一。

答案 1 :(得分:1)

Postgres认为时区感知时间戳是可变的。所以这就是失败的原因。我发现以下GIST为我解决了这个问题: https://gist.github.com/cobusc/5875282

GIST内容的快捷方式(谢谢cobusc):

CREATE INDEX my_index_name_idx ON my_table (date(created_ts at TIME ZONE 'UTC'));

为我工作