我面临以下错误:
ERROR: functions in index expression must be marked IMMUTABLE
尝试创建这样的索引时:
CREATE INDEX full_phone_number ON orders_clientphone (concat(area_code, phone));
另一方面,当使用替代语法进行连接时:
CREATE INDEX full_phone_number ON orders_clientphone ((area_code || phone));
Postgres 对此非常满意。
两列都定义为character varying(256)
。
Postgres 的决定因素是该函数在系统目录中
concat()
定义为稳定且不可变:pg_proc
手册
pg_proc.provolatile
:我还添加了函数 (
"any"
) 的参数类型以连接到 @dezso 和 @jjanes 的答案,这提供了使该函数仅稳定的决定背后的基本原理。以及内部函数的名称 (text_concat
)。这是一个相关的问题来说明为什么索引表达式的不变性是一个必要条件:
至于使用运算符
||
:内部使用的函数取决于操作数的实际数据类型。运算符的定义包括 Postgres 中操作数的数据类型。所有的功能都不同,也不同于
text_concat
上面。||
当其中一个运算符为 时,它也很稳定anynonarray
。窗帘后面的事情并不是那么琐碎。character varying(256)
(像任何varchar
变体一样)是二进制强制的,text
因此函数类型解析默认为text
.要填写 dezso 的答案,以下是相同输入的示例,根据数据库状态产生不同的输出:
我相信concat,在文档中定义如下:
不是不可变的,因为文本表示可能取决于数据库设置,例如 date 或 timestamp。