database - 数据类型字符变化没有访问方法 "gist"的默认运算符类

标签 database postgresql exception

我尝试执行以下命令 (Postgresql):

ALTER TABLE authentication ADD CONSTRAINT overlapping_times EXCLUDE USING GIST
(method with =,
 authenticator with =,
 box(point(extract(epoch FROM validfrom at time zone 'UTC'),extract(epoch FROM validfrom at time zone 'UTC') ),
     point(extract(epoch FROM validuntil at time zone 'UTC'), extract(epoch FROM validuntil at time zone 'UTC'))) WITH &&
)

我收到以下错误消息:

ERROR:  data type character varying 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.

我做了相当广泛的谷歌搜索,但我仍然无法将其翻译成简单的英语。我应该怎么做才能执行上面的命令? “method”的类型是字符变化,“authenticator”是文本,“validfrom”,“validuntil”是日期。

最佳答案

对于authenticatormethod,使用普通的唯一约束。出于索引目的,text 和 varchar() 是相同的。

这意味着三个 alter table 语句而不是一个,但它应该可以避免这些问题。 Box 应该适本地支持 GiST,所以你应该在那里做得很好。

用简单的英语来说,错误是告诉您数据类型不支持索引类型所期望的索引操作。因此,无法通过索引来搜索文本字符串,例如它们是否重叠。也就是说三者不能放在同一个约束条件下。

此外,请记住 UNIQUE 约束比排除约束更快,因此在它们工作的地方更受欢迎。

关于database - 数据类型字符变化没有访问方法 "gist"的默认运算符类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14500739/

相关文章:

PHP更新数据库

regex - 我可以使用正则表达式来匹配一组值吗?

ruby-on-rails - PGconn.connect ....断开连接在哪里?

ruby-on-rails - 如何加速 Rails 4 中的动态选择

c# - 我如何判断异常是否被故意抛出?

mysql - Grails 删除孤儿多对多关系

database - 我可以作为数据库角色执行 Entity Framework 查询吗?

SQL 服务器 : how to return 1 row as default if condition not met

C++ 仅在满足模板类型的条件时才创建类的实例

java - 验证成功的 String 到 Java 中的枚举转换