PostgreSQL排除使用错误:数据类型整数没有默认的运算符类


37

在PostgreSQL 9.2.3中,我试图创建此简化表:

CREATE TABLE test (
    user_id INTEGER,
    startend TSTZRANGE,
    EXCLUDE USING gist (user_id WITH =, startend WITH &&)
);

但是我得到这个错误:

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

PostgreSQL的文档使用这个例子不为我工作:

CREATE TABLE room_reservation (
    room text,
    during tsrange,
    EXCLUDE USING gist (room WITH =, during WITH &&)
);

同样的错误信息。

而这个对我也不起作用:

CREATE TABLE zoo (
    cage   INTEGER,
    animal TEXT,
    EXCLUDE USING gist (cage WITH =, animal WITH <>)
);

同样的错误信息。

我能够毫无问题地创建它:

CREATE TABLE test (
    user_id INTEGER,
    startend TSTZRANGE,
    EXCLUDE USING gist (startend WITH &&)
);

和这个:

CREATE TABLE test (
    user_id INTEGER,
    startend TSTZRANGE,
    EXCLUDE USING btree (user_id WITH =)
);

我花了很多时间寻找有关弄清楚如何使它起作用或弄不明白为什么不起作用的提示。有任何想法吗?


9
+1看,人!就是这样做的。该问题具有所需的一切:RDBMS 版本,示例代码,错误消息,问题的明确定义,链接,OP尝试过的内容的显示。作品。无噪音。这是第一次使用的用户!开头语 立即说服我仔细看一下。
Erwin Brandstetter

Answers:


29

btree_gist按照手册中的说明在链接到的位置安装附加模块:

您可以使用btree_gist扩展名来定义普通标量数据类型的排除约束,然后可以将其与范围排除结合使用,以实现最大的灵活性。例如,btree_gist安装后,以下约束将仅在会议室号相等时才拒绝重叠范围:

在现代PostgreSQL中,您只需要运行(每个数据库一次):

CREATE EXTENSION btree_gist;

您需要首先在操作系统中安装“ contrib”软件包。详细信息取决于您的操作系统和所使用的软件存储库。对于Debian家族来说,通常是这样postgresql-contrib-9.2(对于Postgres 9.2)。或仅postgresql-contrib适用于Red Hat家族。考虑关于SO的这个相关答案:


1
那实际上是我尝试的第一件事。它是在一个更大的脚本中,并且此错误消息被掩埋在输出中:ERROR: could not open extension control file "/opt/local/share/postgresql92/extension/btree_gist.control": No such file or directory。我还认为它已经安装,因为...EXCLUDE USING gist (startend WITH &&)...工作如我的原始帖子中所示。感谢您对此进行百万分之一的研究。现在研究该错误。
伊恩·蒂莫西

3
@DenverTimothy:我想我也可以提供帮助。您可能需要先postgresql-contrib-9.2在操作系统中安装contrib软件包 。取决于您的操作系统。考虑关于SO的这个相关答案。
Erwin Brandstetter

另外,可能需要注意的是该port工具正在随该工具安装的Mac OS 10.8.2上运行。
伊恩·蒂莫西

@DenverTimothy:我没有使用Mac,但是主要原理应该相同。在运行之前,请先在操作系统中安装该软件包CREATE EXTENSION
Erwin Brandstetter


2

如果某人不能或不想使用此功能:

CREATE EXTENSION btree_gist;

就我而言,因为Django 1.11 ORM不支持该索引,并且我不想在Django之外编写SQL。我用类似的东西:

EXCLUDE USING gist (
    int4range(userid, userid, '[]') WITH =,
    startend WITH && 
)

“ []”用于确保两个边界都包含在内。用Postgres 9.6和10.5测试。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.