17

我想使用 GIN 索引uuid[](对 uuid 数组进行有效的成员资格测试)。但是,当我尝试它时,PostgreSQL 给了我一个错误:

mydb=> CREATE TABLE foo (val uuid[]);
CREATE TABLE
mydb=> CREATE INDEX foo_idx ON foo USING GIN(val);
ERROR:  data type uuid[] has no default operator class for access method "gin"
HINT:  You must specify an operator class for the index or define a default operator class for the data type.

如何添加必要的运算符类以使其正常工作?

请注意,对于该类型,是一个类似的问题,citext但提供的答案不起作用。

4

2 回答 2

30

注意:此答案已过时,因为它现在是标准 PostgreSQL 的一部分,请参阅 tbussmann 的其他答案(您应该赞成)。

原答案:

这可以使用以下操作符类来完成:

CREATE OPERATOR CLASS _uuid_ops DEFAULT 
  FOR TYPE _uuid USING gin AS 
  OPERATOR 1 &&(anyarray, anyarray), 
  OPERATOR 2 @>(anyarray, anyarray), 
  OPERATOR 3 <@(anyarray, anyarray), 
  OPERATOR 4 =(anyarray, anyarray), 
  FUNCTION 1 uuid_cmp(uuid, uuid), 
  FUNCTION 2 ginarrayextract(anyarray, internal, internal), 
  FUNCTION 3 ginqueryarrayextract(anyarray, internal, smallint, internal, internal, internal, internal), 
  FUNCTION 4 ginarrayconsistent(internal, smallint, anyarray, integer, internal, internal, internal, internal), 
  STORAGE uuid;

归功于为我指明了正确的方向。

相关文档在Interface extensions to indices中,特别是 GIN 的操作符策略和功能编号在此处进行了描述。

于 2013-11-13T16:54:42.677 回答
9

从 PostgreSQL 10 开始,_uuid_ops不再需要自定义运算符类,因为现在有一个通用的内置 opclass array_opsanyarry参见: https ://www.postgresql.org/docs/current/static/gin-builtin-opclasses.html )

于 2018-07-06T16:45:42.937 回答