Postgresql

PostgreSQL EXCLUDE USING 錯誤:數據類型整數沒有預設運算符類

  • September 16, 2021

在 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安裝手冊中提到的附加模組:

您可以使用btree_gist擴展來定義純標量數據類型的排除約束,然後可以將其與範圍排除相結合以獲得最大的靈活性。例如,btree_gist安裝後,僅當會議室編號相等時,以下約束才會拒絕重疊範圍:

在現代 PostgreSQL 中,您只需要執行(每個數據庫一次):

CREATE EXTENSION btree_gist;

您需要首先在您的作業系統中安裝“contrib”包。詳細資訊取決於您的作業系統和使用的軟體儲存庫。對於 Debian 系列,它通常是postgresql-contrib-13(對於 Postgres 13)。或者只是postgresql-contrib為了紅帽家族。考慮關於 SO 的相關答案:

引用自:https://dba.stackexchange.com/questions/37351