首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在排除约束中与postgresql gist一起使用uuid

如何在排除约束中与postgresql gist一起使用uuid
EN

Stack Overflow用户
提问于 2018-05-09 15:18:22
回答 2查看 1.2K关注 0票数 2

当我使用gist使用排除约束时,我得到了错误

代码语言:javascript
复制
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是一个错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-09 20:39:01

为此,您需要btree_gist扩展:

time without time zonedateintervald15、money、char、varchar、d19、bytea、bit、varbit、d23代码>、d24>代码>、< uuid,>、代码>、< btree_gist >代码>、< GiST >代码>、代码>的

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

使用v10,您应该能够使用

代码语言:javascript
复制
base_id gist_uuid_ops WITH =

在你的排除约束中。

对于9.4,可以先将列转换为不同的类型:

代码语言:javascript
复制
(base_id::text) gist_text_ops WITH =
票数 2
EN

Stack Overflow用户

发布于 2021-01-19 10:31:52

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

代码语言:javascript
复制
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迁移中如何做到这一点:

代码语言:javascript
复制
execute "CREATE EXTENSION IF NOT EXISTS btree_gist"
create constraint(:tbl_product, "constraint_name", exclude: ~s|gist ("base_id" WITH =, lifetime WITH &&)|)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50256819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档