如何在EXCLUDE约束中使用uuid和postgresql gist

时间:2018-05-09 15:18:23

标签: postgresql btree-gist

我使用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,因为我没有任何其他选项,因为我无法在9.5中安装temporal扩展名,9.6和10都会出错。

2 个答案:

答案 0 :(得分:1)

您需要btree_gist扩展程序:

  

btree_gist提供GiST索引运算符类,它们为数据类型int2int4int8float4,{{实现B树等效行为1}},float8numerictimestamp with time zonetimestamp without time zonetime with time zonetime without time zonedate,{{1} },intervaloidmoneycharvarchartextbyteabitvarbitmacaddrmacaddr8 inet 以及所有cidr类型。

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

使用v10,您应该可以使用

enum

在您的排除约束中。

使用9.4,您可以先将列转换为其他类型:

uuid

答案 1 :(得分: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 &&)|)