gpt4 book ai didi

sql - 错误 : functions in index expression must be marked IMMUTABLE in Postgres

转载 作者:行者123 更新时间:2023-11-29 11:09:57 24 4
gpt4 key购买 nike

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

--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_MESSAGES 设置

在您的情况下,这显然没有意义,因为您使用的格式永远不会取决于语言环境,因此如果您确实需要在索引中使用文本表示,您可以创建自己的 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 使用 索引,您还需要在 SQL 语句中调用 my_to_char()。当你使用内置的 to_char()

时它不会识别它

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

关于sql - 错误 : functions in index expression must be marked IMMUTABLE in Postgres,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5973030/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com