CREATE OPERATOR CLASS
用于创建新的操作符类。
简介
CREATE OPERATOR CLASS
创建新的操作符类。 一个操作符类定义一种特殊的数据类型如何被用于一个索引。操作符类指定为该数据类型和索引方法扮演特殊角色或者“策略”的操作符。操作符类还指定当该操作符类被选择用于一个索引列时,索引方法要使用的支持函数。 操作符类所使用的所有操作符和函数必须在操作符类被创建之前被定义好。
如果给出了一个模式名称,那么该操作符类会被创建在指定模式中。否则,它会被创建在当前模式中。同一模式中的两个操作符类只有在被用于不同的索引方法时才可以具有相同的名称。
定义操作符类的用户将成为其拥有者。当前,创建用户必须是超级用户(做出这种限制是因为错误的操作符类定义会让服务器混淆甚至崩溃)。
CREATE OPERATOR CLASS
当前不会检查操作符类定义是否包括该索引方法所要求的所有操作符和函数,也不会检查这些操作符和函数是否构成一个一致的集合。定义一个合法的操作符类是用户的责任。
相关的操作符类可以被组成操作符族。要把一个新的操作符类加入到一个现有的族中,可以在CREATE OPERATOR CLASS
中指定FAMILY
选项。如果没有这个选项, 新的类会被放到一个同名的族中(如果族不存在会创建之)。
语法
CREATE OPERATOR CLASS name [ DEFAULT ] FOR TYPE data_type
USING index_method [ FAMILY family_name ] AS
{ OPERATOR strategy_number operator_name [ ( op_type, op_type ) ] [ FOR SEARCH | FOR ORDER BY sort_family_name ]
| FUNCTION support_number [ ( op_type [ , op_type ] ) ] function_name ( argument_type [, ...] )
| STORAGE storage_type
} [, ... ]
参数
name
要创建的操作符类的名称。该名称可以被模式限定。
DEFAULT
如果存在,该操作符类将成为其数据类型的默认操作符类。对一种特定的数据类型和索引方法至多有一个默认操作符类。
data_type
这个操作符类所用于的列数据类型。
index_method
这个操作符类所用于的索引方法的名称。
family_name
要把这个操作符类加入其中的已有操作符族的名称。如果没有指定, 将使用一个同名操作符族(如果还不存在则创建之)。
strategy_number
用于一个与该操作符类相关联的操作符的索引方法策略号。
operator_name
一个与该操作符类相关联的操作符的名称(可以被模式限定)。
op_type
在一个OPERATOR
子句中,这表示该操作符的操作数数据类型,或者用NONE
来表示一个左一元或者右一元操作符。 在操作数数据类型与该操作符的数据类型相同的一般情况下,操作数的数据类型可以被省略。
在一个FUNCTION
子句中,这表示该函数要支持的操作数据类型,如果它与该函数的输入数据类型(对于 B-树比较函数和哈希函数)或者操作符类的数据类型(对于 B-树排序支持函数和与 B-树相同的图像函数以及所有 GiST、 SP-GiST、GIN 和 BRIN 操作符类中的函数)不同。这些默认值是正确的,并且 op_type
因此不必在FUNCTION
子句中被指定,对于 B-树排序支持函数的情况来说,这表示跨数据类型比较。
sort_family_name
一个现有btree
操作符族的名称(可以是模式限定的), 它描述与一种排序操作符相关联的排序顺序。
如果FOR SEARCH
和FOR ORDER BY
都没有被指定,那么FOR SEARCH
是默认值。
support_number
用于一个与该操作符类相关联的函数的索引方法支持函数编号。
function_name
一个用于该操作符类的索引方法支持函数的函数名称(可以是模式限定的)。
argument_type
该函数的参数数据类型。
storage_type
实际存储在索引中的数据类型。通常这和列数据类型相同,但是有些索引方法(当前有 GiST、GIN 和 BRIN)允许它们不同。 除非索引方法允许使用不同的类型,STORAGE
子句必须被省略。 如果 data_type
列被指定为anyarray
, 那么 storage_type
可以被声明为anyelement
以指示索引条目是属于为每个特定索引创建的实际数组类型的元素类型的成员。
OPERATOR
、FUNCTION
和STORAGE
子句可以以任何顺序出现。
说明
因为索引机制在使用函数之前不检查它们的权限,将一个函数或者操作符包括在一个操作符类中相当于在其上授予公共执行权限。这对操作符类中很有用的函数来说通常不成问题。
操作符不应该用 SQL 函数定义。SQL 函数很有可能会被内联到调用查询中,这会妨碍优化器识别该查询匹配一个索引。
示例
为数据类型_int4
(int4
数组) 定义了一个 GiST 索引操作符。
CREATE OPERATOR CLASS gist__int_ops
DEFAULT FOR TYPE _int4 USING gist AS
OPERATOR 3 &&,
OPERATOR 6 = (anyarray, anyarray),
OPERATOR 7 @>,
OPERATOR 8 <@,
OPERATOR 20 @@ (_int4, query_int),
FUNCTION 1 g_int_consistent (internal, _int4, smallint, oid, internal),
FUNCTION 2 g_int_union (internal, internal),
FUNCTION 3 g_int_compress (internal),
FUNCTION 4 g_int_decompress (internal),
FUNCTION 5 g_int_penalty (internal, internal, internal),
FUNCTION 6 g_int_picksplit (internal, internal),
FUNCTION 7 g_int_same (_int4, _int4, internal);