CREATE OPERATOR CLASS — 定义一个新的操作符类
CREATE OPERATOR CLASSname
[ DEFAULT ] FOR TYPEdata_type
USINGindex_method
[ FAMILYfamily_name
] AS { OPERATORstrategy_number
operator_name
[ (op_type
,op_type
) ] [ FOR SEARCH | FOR ORDER BYsort_family_name
] | FUNCTIONsupport_number
[ (op_type
[ ,op_type
] ) ]function_name
(argument_type
[, ...] ) | STORAGEstorage_type
} [, ... ]
CREATE OPERATOR CLASS
创建新的操作符类。
一个操作符类定义一种特殊的数据类型如何被用于一个索引。操作符类指定为
该数据类型和索引方法扮演特殊角色或者“策略”的操作符。操作符
类还指定当该操作符类被选择用于一个索引列时,索引方法要使用的支持函数。
操作符类所使用的所有操作符和函数必须在操作符类被创建之前被定义好。
如果给出了一个模式名称,那么该操作符类会被创建在指定模式中。否则,它 会被创建在当前模式中。同一模式中的两个操作符类只有在被用于不同的索引 方法时才可以具有相同的名称。
定义操作符类的用户将成为其拥有者。当前,创建用户必须是超级用户(做出 这种限制是因为错误的操作符类定义会让服务器混淆甚至崩溃)。
CREATE OPERATOR CLASS
当前不会检查操作符
类定义是否包括该索引方法所要求的所有操作符和函数,也不会检查这些操作符
和函数是否构成一个一致的集合。定义一个合法的操作符类是用户的责任。
相关的操作符类可以被组成操作符族。要把一个新的操作符类
加入到一个现有的族中,可以在CREATE OPERATOR
CLASS
中指定FAMILY
选项。如果没有这个选项,
新的类会被放到一个同名的族中(如果族不存在会创建之)。
进一步的信息可参考第 38.15 节。
name
要创建的操作符类的名称。该名称可以被模式限定。
DEFAULT
如果存在,该操作符类将成为其数据类型的默认操作符类。对一种 特定的数据类型和索引方法至多有一个默认操作符类。
data_type
这个操作符类所用于的列数据类型。
index_method
这个操作符类所用于的索引方法的名称。
family_name
要把这个操作符类加入其中的已有操作符族的名称。如果没有指定, 将使用一个同名操作符族(如果还不存在则创建之)。
strategy_number
用于一个与该操作符类相关联的操作符的索引方法策略号。
operator_name
一个与该操作符类相关联的操作符的名称(可以被模式限定)。
op_type
在一个OPERATOR
子句中,这表示该操作符的操作数数据
类型,或者用NONE
来表示一个左一元或者右一元操作符。
在操作数数据类型与该操作符的数据类型相同的一般情况下,操作数的
数据类型可以被省略。
在一个FUNCTION
子句中,这表示该函数要支持的操作数
数据类型,如果它与该函数的输入数据类型(对于 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 函数很有可能会被内联到调用查询中,这 会妨碍优化器识别该查询匹配一个索引。
在PostgreSQL 8.4 之前,
OPERATOR
子句可以包括一个RECHECK
选项。现在
已经不再支持,因为一个索引操作符是否为“有损的”现在是在运行
时实时决定的。这允许在一个操作符可能是或者可能不是有损的情况下有效地处理。
下面的例子为数据类型_int4
(int4
数组)
定义了一个 GiST 索引操作符。完整的例子请见
intarray模块。
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);
CREATE OPERATOR CLASS
是一种
PostgreSQL扩展。在 SQL 标准中没有
CREATE OPERATOR CLASS
语句。