Ошибка "функции в выражении индекса должны быть помечены как IMMUTABLE", а не как отметка времени
Я пытаюсь создать следующий индекс;
CREATE INDEX idx_concat_paostartno_paostartsuff ON
dmv_os_addbase_residential (concat(pao_start_number || pao_start_suffix));
Я получаю ошибку;
ОШИБКА: функции в выражении индекса должны быть помечены как IMMUTABLE`
Я думаю, что это смешивание типов, так как pao_start_number
это тип bigint
а также pao_start_suffix
является varchar
, Я пытался решить как;
CREATE INDEX idx_concat_paostartno_paostartsuff ON
dmv_os_addbase_residential (concat((pao_start_number :: text) || pao_start_suffix))
но та же ошибка.
Правильно ли я определил причину ошибки и как ее устранить? Я использую Postgres 9.6
2 ответа
Решение
Вы, вероятно, хотите
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>
один из =
, <
, <=
, >
или же >=
,
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'));
работал на меня