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

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


,但出现此错误:


PostgreSQL文档使用的示例不适用于我:

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.


相同的错误消息。

这一个对我也不起作用的东西:这没有任何问题:

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 <>)
);


我花了很多钱时间寻找有关弄清楚如何进行这项工作的提示,或者弄清楚为什么它行不通的提示。有什么想法吗?

评论

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

后续问题:dba.stackexchange.com/questions/37391/…

#1 楼

如链接所述,在链接到的位置安装附加模块btree_gist


您可以使用btree_gist扩展名在普通标量数据类型上定义排除约束,然后可以与范围排除组合使用,以实现最大的灵活性。例如,在安装了btree_gist
之后,仅当会议室号相等时,以下约束才会拒绝重叠范围
:运行(每个数据库一次):

CREATE EXTENSION btree_gist;


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


在PostgreSQL上创建无意义扩展时出错


评论


那实际上是我尝试的第一件事。它在一个更大的脚本中,并且此错误消息被隐藏在输出中:错误:无法打开扩展控制文件“ /opt/local/share/postgresql92/extension/btree_gist.control”:没有此类文件或目录。我还以为它已经安装了,是因为... EXCLUDE USING gist(startend WITH &&)...的工作方式如我的原始帖子所示。感谢您对此进行百万分之一的研究。现在研究该错误。

–伊恩·蒂莫西(Ian Timothy)
13年3月22日在21:09



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

–欧文·布兰德斯特(Erwin Brandstetter)
13年3月22日在21:15



另外,可能会有所帮助,请注意它正在与端口工具一起安装的Mac OS 10.8.2上运行。

–伊恩·蒂莫西(Ian Timothy)
13年3月22日在21:17

@DenverTimothy:我没有使用Mac,但是主要原理是相同的。您必须先在操作系统中安装软件包,然后才能运行CREATE EXTENSION。

–欧文·布兰德斯特(Erwin Brandstetter)
13年3月22日在21:25

链接到带有答案的postgres邮件列表线程

– Eugen Konkov
18年7月10日在7:30

#2 楼

如果有人不能或不想使用它:

CREATE EXTENSION btree_gist;


就我而言,因为Django 1.11 ORM不支持该索引,所以我没有不想在Django之外编写SQL。我使用了类似以下内容的东西:经过Postgres 9.6和10.5的测试。