Postgresql
排除約束生成:錯誤:運算符 &&(anyrange,anyrange) 不是運算符族“range_ops”的成員
當我嘗試使用 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 &&) );
運算符類
只要預設 GIST 運算符類正確地預設為您使用的類型,它就應該可以工作:它不適用於
inet
andcidr
也可以看看,