PostgreSQL GIN index on array of uuid

匿名 (未验证) 提交于 2019-12-03 02:48:02

问题:

I would like to use a GIN index on uuid[] (to have efficient membership tests for arrays of uuids). However when I try it PostgreSQL gives me an error:

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. 

How can I add the necessary operator class so that it works?

Note that this is a similar question for the type citext but the provided answer doesn't work.

回答1:

This can be done using the following operator class:

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; 

Credits to this for pointing me in the right direction.

The relevant documentation is in Interfacing extensions to indexes, in particular the operator strategy and function numbers for GIN are described there.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!