当我使用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是一个错误。
发布于 2018-05-09 20:39:01
为此,您需要btree_gist扩展:
time without time zone、date、interval、d15、money、char、varchar、d19、bytea、bit、varbit、d23代码>、d24>代码>、< uuid,>、代码>、< btree_gist >代码>、< GiST >代码>、代码>的
不幸的是,只在uuid中添加了对v10的支持。
使用v10,您应该能够使用
base_id gist_uuid_ops WITH =在你的排除约束中。
对于9.4,可以先将列转换为不同的类型:
(base_id::text) gist_text_ops WITH =发布于 2021-01-19 10:31:52
接受的答案是正确的,需要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 &&)|)https://stackoverflow.com/questions/50256819
复制相似问题