在创建函数索引时遇到报错,报错信息即为标题,下面是详细信息。

1 表定义

1
2
3
4
5
6
7
skytf=> \d test_39;  
Table "skytf.test_39"
Column | Type | Modifiers
-------------+--------------------------+-----------
skyid | integer |
create_time | timestamp with time zone |
name | character varying(32) |

现在需要在字段 “skyid”, “create_time” 上创建联合索引。

2 创建索引

1
2
skytf=> create index CONCURRENTLY idx_test_skyid_ctime on test_39 using btree (skyid, to_char(create_time, 'YYYY-MM-DD') );  
ERROR: functions in index expression must be marked IMMUTABLE

创建函数索引报错,”functions in index expression must be marked IMMUTABLE” ,意思为建立函数索引时 函数必须标识为 “IMMUTABLE”。

3 查看 to_char 函数

1
2
3
4
5
6
7
8
9
10
11
12
13
skytf=> \df to_char();  
List of functions
Schema | Name | Result data type | Argument data types | Type
------------+---------+------------------+-----------------------------------+--------
pg_catalog | to_char | text | bigint, text | normal
pg_catalog | to_char | text | double precision, text | normal
pg_catalog | to_char | text | integer, text | normal
pg_catalog | to_char | text | interval, text | normal
pg_catalog | to_char | text | numeric, text | normal
pg_catalog | to_char | text | real, text | normal
pg_catalog | to_char | text | timestamp with time zone, text | normal
pg_catalog | to_char | text | timestamp without time zone, text | normal
(8 rows)

4 以 postgres 超级用户连接,修改 to_char 函数属性

1
2
skytf=# alter function to_char(timestamp with time zone, text) IMMUTABLE;  
ALTER FUNCTION

备注:由于表 test_39 上的列 create_time 类型为 “timestamp with time zone” , 所以修改函数时应该修改函数 to_char(timestamp with time zone, text),为了安全己见,不要直接修改 to_char 函数,建议新建一个 IMMUTABLE 属性的 to_char_immutable 函数。

5 验证是否生效

1
2
3
4
5
6
skytf=> \ef to_char(timestamp with time zone, text)
CREATE OR REPLACE FUNCTION pg_catalog.to_char(timestamp with time zone, text)
RETURNS text
LANGUAGE internal
IMMUTABLE STRICT
AS $function$timestamptz_to_char$function$

从“IMMUTABLE STRICT” 中可以看出,函数已经修改成 “IMMUTABLE”属性。

6 以 skytf 连接, 再次创建索引

1
2
skytf=> create index CONCURRENTLY idx_test_skyid_ctime on test_39 using btree (skyid, to_char(create_time, 'YYYY-MM-DD') );  
CREATE INDEX

备注:在修改函数 to_char(timestamp with time zone, text) 属性后,创建索引就成功了。

1
2
3
4
5
6
7
8
9
skytf=> \d test_39  
Table "skytf.test_39"
Column | Type | Modifiers
-------------+--------------------------+-----------
skyid | integer |
create_time | timestamp with time zone |
name | character varying(32) |
Indexes:
"idx_test_skyid_ctime" btree (skyid, to_char(create_time, 'YYYY-MM-DD'::text))

7 手册上关于 “IMMUTABLE” 属性解释

IMMUTABLE indicates that the function cannot modify the database and always returns the same result when given the same argument values; that is, it does not do database lookups or otherwise use information not directly present in its argument list. If this option is given, any call of the function with all-constant arguments can be immediately replaced with the function value.

8 总结
函数的默认属性为 “VOLATILE”, 即可变的,在创建函数索引时,需要将引用函数的属性改为”IMMUTABLE”, 即稳定的,函数索引才能创建成功。也就是说,只有属性为稳定的函数,才能用来创建函数索引。

ERROR: Functions in index expression must be marked IMMUTABLE的更多相关文章

  1. Error: Error setting TTL index on collection : sessions

    Error: Error setting TTL index on collection : sessions 一.步骤一: 这个问题一般是直接升级 mongodb和connect-mongo的版本为 ...

  2. Solve Error Debug Assertion Failed Expression vector iterators incompatible Using PCL in Release Mode of VS2010

    When using PCL 1.4.0 in the release mode building under VS2010, we might sometime get the error &quo ...

  3. 解决报错error the @annotation pointcut expression is only supported at Java 5

    eclipse搭建环境后报错 error the @annotation pointcut expression is only supported at Java 5 错误意思大致是:注释切入点表达 ...

  4. 编译时错误之 error C2338: tuple_element index out of bounds

    part 1 编译器 vs2015 VC++. 完整的错误信息粘贴如下: d:\program files (x86)\microsoft visual studio 14.0\vc\include\ ...

  5. Type Syntax error, insert ")" to complete Expression

      今天倒持了 几个小时!    愣是 没有明确 ,为什么我的JSP的第一行没有代码?  还是报错!   错误是: Description Resource Path Location Type Sy ...

  6. bullet, iOS真机编译错误error: identifier or immediate expression expected解决方法

    刚才发现c3dEngine2(http://git.oschina.net/wantnon2/c3dEngine2 或 https://github.com/wantnon2/c3dEngine2)的 ...

  7. ERROR 1709 (HY000): Index column size too large. The maximum column size is 767 bytes.

    MySQL版本5.6.35 在一个长度为512字符的字段上创建unique key报错 CREATE DATABASE dpcs_metadata DEFAULT CHARACTER SET utf8 ...

  8. C++ error:Debug Assertion Failed.Expression:_BLOCK_TYPE_IS_VALID(phead->nBlock)

    Debug Assertion Failed.Expression:_BLOCK_TYPE_IS_VALID(phead->nBlockUse) 关于上面这个错误,我在上一篇文章中的程序遇到过了 ...

  9. error the @annotation pointcut expression is only supported at Java 5 compliance

    今天碰到这个错误,在网上找了下,是因为aspectjweaver.jar用的是1.5.3 本地eclipse的jdk版本为1.7 下载高版本的aspectjweaver.jar会解决此问题 http: ...

  10. digestmd5.c:4037:15: error: #elif with no expression

    执行如下:sed -i.bak 's/#elif WITH_DES/#elif defined(WITH_DES)/' \ plugins/digestmd5.c

随机推荐

  1. 直接快速下载NLTK数据

    直接快速下载NLTK数据 直接下载NLTK的数据速度很慢,这里提供NLTK数据集,直接下载即可.或者选择下列百度云下载: 链接:https://pan.baidu.com/s/17ZgkoQeMosW ...

  2. Leanote蚂蚁笔记-私人云笔记服务器搭建

    title: Leanote蚂蚁笔记-私人云笔记服务器搭建 date: 2020-02-22 21:53:24 categories: - [IT,技术] - [IT,软件,程序] - [IT,软件, ...

  3. week_7

    Andrew Ng 机器学习笔记 ---By Orangestar Week_7 This week, you will be learning about the support vector ma ...

  4. ob_DES_艺恩

    网站 aHR0cHM6Ly93d3cuZW5kYXRhLmNvbS5jbi9Cb3hPZmZpY2UvQk8vWWVhci9pbmRleC5odG1s 抓包返回密文  点到initator,PostA ...

  5. 8、IDEA提交代码出现: Fetch failed fatal: Could not read from remote repository

    转载自 第一步.确认Git公钥/密钥是否生成: 1. 首先查看本地是否生成git密钥,一般在C盘home目录下:[C:你自己的home目录\.ssh] 第二步:添加Git密钥: 右键->Git ...

  6. MyBatis四大参数两种写法

    MyBatis四大参数两种写法 1.在主配置文件中,直接写到value值里面 2.四大参数写入单独配置文件 开始是 为了避免以后其他框架冲突 都加个前缀 jdbc. 主要是红色框里的三个部分 自己定义 ...

  7. Hive详解(03) - hive基础使用

    Hive详解(03) - hive基础使用 Hive数据类型 基本数据类型 对于Hive的String类型相当于数据库的varchar类型,该类型是一个可变的字符串,不过它不能声明其中最多能存储多少个 ...

  8. JSONObject 相关

    /** * 将json转为对应实体类 */ public static Object jsonToJavaObj(String json, Class cs) { return jsonToJavaO ...

  9. Ubuntu snap 下载慢

    解决方法 sudo apt-get install snapd sudo snap install snap-store sudo snap install snap-store-proxy sudo ...

  10. Z-Blog后台getshell

    Z-Blog后台getshell 本人所有文章均为技术分享,均用于防御为目的的记录,所有操作均在实验环境下进行,请勿用于其他用途,否则后果自负. 0x00 环境部署 文件下载地址 打开phpstudy ...