CREATE OPERATOR CLASS — 定义一个新的操作符类
CREATE OPERATOR CLASSname[ DEFAULT ] FOR TYPEdata_typeUSINGindex_method[ FAMILYfamily_name] AS { OPERATORstrategy_numberoperator_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选项。如果没有这个选项, 新类会被放入一个与其同名的操作符族中(如果该操作符族尚不存在,就会创 建它)。
进一步的信息可参考Section 37.16。
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 操作符类中的所有函数),则 需要在这里指定。上述默认值通常都是正确的,因此一般不必在 FUNCTION子句中指定op_type; 唯一的例外是某个 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语句。