Postgresql

排除約束生成:錯誤:運算符 &&(anyrange,anyrange) 不是運算符族“range_ops”的成員

  • May 4, 2018

當我嘗試使用 GIST 創建排除約束時,怎麼會?

CREATE TABLE foo (
 a tsrange,
 EXCLUDE (a WITH &&)
);
ERROR:  operator &&(anyrange,anyrange) is not a member of operator family "range_ops"
DETAIL:  The exclusion operator must be related to the index operator class for the constraint.

具有 (Overlaps)的EXCLUSION約束&&需要是GIST或者SP-GIST因為預設索引是btree並且其運算符類不支持&&(Overlaps)。從介面擴展到索引的文件

GiST 索引更靈活:它們根本沒有一套固定的策略。相反,每個特定 GiST 運算符類的“一致性”支持常式會根據自己的喜好解釋策略編號。例如,幾個內置的 GiST 索引運算符類索引二維幾何對象,提供表 37.4 中所示的“R-tree”策略。其中四個是真正的二維測試(重疊、相同、包含、包含);其中四個只考慮X方向;其他四個在 Y 方向提供相同的測試。

您可以在排除約束上使用 GIST 索引,

CREATE TABLE foo (
 a tsrange,
 EXCLUDE USING GIST (a WITH &&)
);

運算符類

  • btree僅支持<, <=, =, >,>=
  • gistsp-gist支持更多。而且,gin也有可能有一天支持在EXCLUSION約束中使用。

只要預設 GIST 運算符類正確地預設為您使用的類型,它就應該可以工作:它不適用於inetandcidr

也可以看看,

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