在 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 =)
);
我花了相当多的时间寻找有关弄清楚如何使这项工作发挥作用或弄清楚为什么它不起作用的提示。有任何想法吗?
在您链接到的位置
btree_gist
安装手册中提到的附加模块:在现代 PostgreSQL 中,您只需要运行(每个数据库一次):
您需要首先在您的操作系统中安装“contrib”包。详细信息取决于您的操作系统和使用的软件存储库。对于 Debian 系列,它通常是
postgresql-contrib-13
(对于 Postgres 13)。或者只是postgresql-contrib
为了红帽家族。考虑关于 SO 的相关答案:如果有人不能或不想使用它:
在我的情况下,因为 Django 1.11 ORM 不支持这个索引,我不想在 Django 之外编写 SQL。我使用了类似的东西:
'[]' 用于确保两个边界都包含在内。使用 Postgres 9.6 和 10.5 测试。