我想创建一个多列表达式索引,但当我创建索引时,会输出以下消息:

--detail message 
wapgrowth=> create index CONCURRENTLY idx_test on  tmp_table using btree (skyid, to_char(create_time, 'YYYY-MM-DD'), actiontype );
ERROR:  functions in index expression must be marked IMMUTABLE


--table ddl
wapgrowth=> \d tmp_table
               Table "wapgrowth.tmp_table"
   Column    |            Type             |   Modifiers   
-------------+-----------------------------+---------------
 id          | integer                     | not null
 actiontype  | character varying(20)       | 
 apptype     | character varying(20)       | 
 score       | integer                     | 
 create_time | timestamp without time zone | default now()
 skyid       | integer                     | 
Indexes:

推荐答案

根据黑客邮件列表中的这条线索:

http://www.mail-archive.com/pgsql-hackers@postgresql.org/msg86725.html

这是预期的行为,因为to_char取决于LC_消息设置

在您的情况下,这显然没有意义,因为您使用的格式永远不会依赖于区域设置,因此如果确实需要在索引中使用文本表示,您可以创建自己的to_char()函数,并将其标记为不可变:

CREATE OR REPLACE FUNCTION my_to_char(some_time timestamp) 
  RETURNS text
AS
$BODY$
    select to_char($1, 'yyyy-mm-dd');
$BODY$
LANGUAGE sql
IMMUTABLE;

如果必须将其用作索引中的文本(并且不能使用Sam建议的日期转换),则需要创建自己的格式化函数,可以将其标记为不可变.然后可以在索引中使用.

但要使Postgres use成为索引,您还需要在SQL语句中调用my_to_char().当您使用内置to_char()时,它将无法识别

但我确实认为山姆的建议在索引中使用直接日期可能更好

Postgresql相关问答推荐

Trunc函数不删除小数

哪种数据类型是除法的结果?

有没有一种方法可以在参数中添加密码,并在批处理文件中需要时自动获取密码?

无法在kubernetes中设置postgres复制

docker-compose.yml用于使用postgres的spring-boot应用程序

我想优化查询SQL

如何重新格式化已获取的 psql 查询输出?

postgres 的密码

PostgreSQL:please specify covering index name是什么意思

冲突中的 Postgres 会更新复合主键

在 PostgreSQL 中表示Sparse稀疏数据

使用 Hibernate 查询:colon gets treated as parameter / escaping colon

与 Oracle 的 CONNECT BY ... START WITH 等效的 PostgreSQL 语法是什么?

为什么 rake db:migrate 有时会在 structure.sql 中添加尾随空格?

PostgreSQL 使用 UUID 与文本作为主键

pg_restore 会覆盖现有的表吗?

ruby on rails jsonb 列默认值

PostgreSQL - 作为表名的动态值

postgresql NOT ILIKE 子句不包含空字符串值

性能调优:为布尔列创建索引