2

使用 gist 使用排除约束时出现错误

ALTER TABLE tbl_product ADD EXCLUDE USING gist (base_id WITH =, lifetime WITH &&);

ERROR:  data type uuid has no default operator class for access method "gist"
HINT:  You must specify an operator class for the index or define a default operator class for the data type.

注: base_id数据类型为uuid, lifetime数据类型为句点

我正在使用 PostgreSQL 9.4。我只能使用 9.4,因为我没有任何其他选项,因为我无法temporal在 9.5、9.6 和 10 中安装扩展程序会给出错误。

4

2 回答 2

2

您将需要btree_gist扩展名:

btree_gistint2为数据类型、int4int8float4float8numerictimestamp with time zonetimestamp without time zonetime with time zonetime without time zonedateintervaloidmoneycharvarchartextbyteabitvarbitmacaddrmacaddr8inetcidruuid和所有类型提供实现 B 树等效行为的 GiST 索引运算符类enum

不幸的uuid是,仅在 v10 中添加了对 的支持。

使用 v10,您应该可以使用

base_id gist_uuid_ops WITH =

在您的排除约束中。

使用 9.4,您可以先将列转换为不同的类型:

(base_id::text) gist_text_ops WITH =
于 2018-05-09T20:39:01.457 回答
0

接受的答案是正确的,btree_gist是必需的,但是建议的解决方案不起作用(至少在 2021 年的 v12 中不起作用)。如果您遇到原始问题中的错误,您应该执行以下操作:

CREATE EXTENSION IF NOT EXISTS btree_gist;
ALTER TABLE tbl_product ADD EXCLUDE USING gist (base_id WITH =, lifetime WITH &&);

作为奖励,我一直在 Elixir & Ecto 3.5 中使用它,以下是如何在 Ecto 迁移中执行此操作:

execute "CREATE EXTENSION IF NOT EXISTS btree_gist"
create constraint(:tbl_product, "constraint_name", exclude: ~s|gist ("base_id" WITH =, lifetime WITH &&)|)
于 2021-01-19T10:31:52.383 回答