postgresql 创建索引,提示must be marked IMMUTABLE

我的jsonb字段里,内容如

{name:“aaa“,data:“2017-12-12”}

我现在想给这个date字段创建索引,结果提示

ERROR: functions in index expression must be marked IMMUTABLE

我查询代码如下:

create index item_date_year on item using btree((date_part('year'::text,(myjsonb ->> 'date')::date)));

我看过date_part这个函数,是稳定的函数(IMMUTABLE)
我在表里单独建立一个字段保存date并建立索引就没问题。

请问是哪里的问题?

postgresql版本9.6

阅读 6.5k
1 个回答

自己暂时解决了,问题出在::date转换上,把jsonb里的date字符串转成date格式,内置的方法,均不是immutable属性(稳定属性),所以不允许建立索引。包括to_date()函数。
解决办法:自己按照内置的to_date()函数,改一个to_date_immutable()函数。
然后给to_date_immutable()函数immutable属性。
然后用自己的to_date_immutable()函数转换格式。就可以创建索引了。

虽然官方不建议在非immutable属性上强行索引,但是为了解决问题。。。没办法了
谁有更好的办法,可以留言哈~!

创建函数代码:

CREATE OR REPLACE FUNCTION to_date_immutable(
    text,
    text)
  RETURNS date AS
'to_date'
  LANGUAGE internal immutable STRICT
  COST 1;
ALTER FUNCTION to_date_immutable(text, text)
  OWNER TO postgres;
COMMENT ON FUNCTION to_date_immutable(text, text) IS 'convert text to date';

建立索引代码:

create index item_date_idx on item using btree((to_date_immutable(info_bak->>'release_date','yyyy-mm-dd')));
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进