CREATE OPERATOR CLASS
CREATE OPERATOR CLASS - 定义一个新的运算符类
语法格式
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
} [, ... ]
说明
CREATE OPERATOR CLASS创建一个新的运算符类。运算符类定义特定数据类型如何与索引一起使用。运算符类指定某些运算符将填充此数据类型和此索引方法的特定角色或”策略”。运算符类还指定在为索引列选择运算符类时索引方法要使用的支持函数。必须先定义运算符类使用的所有运算符和函数,然后才能创建运算符类。
如果给出了模式名称,则在指定的模式中创建运算符类。否则,它将在当前架构中创建。同一模式中的两个运算符类只有在用于不同的索引方法时才能具有相同的名称。
定义运算符类的用户将成为其所有者。目前,创建用户必须是超级用户。(这种限制是因为错误的操作符类定义可能会使服务器混淆甚至崩溃。)
CREATE OPERATOR CLASS目前不检查运算符类定义是否包括索引方法所需的所有运算符和函数,以及运算符和函数是否形成自洽集。用户有责任定义有效的运算符类。
相关的运算符类可以分组为运算符系列。要向现有族添加新的运算符类,请在CREATE OPERATOR CLASS 中指定 FAMILY选项。如果没有此选项,则将新类放入与新类名称相同的族中(如果该族不存在,则创建该族)。
参数说明
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函数可能会内联到调用查询中,这将阻止优化器识别查询与索引匹配。
示例
以下示例命令为数据类型 _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);