我使用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都会出错。
答案 0 :(得分:1)
您需要btree_gist
扩展程序:
btree_gist
提供GiST索引运算符类,它们为数据类型int2
,int4
,int8
,float4
,{{实现B树等效行为1}},float8
,numeric
,timestamp with time zone
,timestamp without time zone
,time with time zone
,time without time zone
,date
,{{1} },interval
,oid
,money
,char
,varchar
,text
,bytea
,bit
,varbit
,macaddr
,macaddr8
,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 &&)|)