# 创建操作员类

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
  } [, ... ]

# 描述

创建操作员类创建一个新的运算符类。操作符类定义了特定数据类型如何与索引一起使用。运算符类指定某些运算符将为该数据类型和该索引方法填充特定的角色或“策略”。运算符类还指定了索引方法在为索引列选择运算符类时要使用的支持函数。运算符类使用的所有运算符和函数必须在创建运算符类之前定义。

如果给定模式名称,则在指定模式中创建运算符类。否则,它会在当前模式中创建。只有当它们用于不同的索引方法时,同一模式中的两个运算符类才能具有相同的名称。

定义操作符类的用户成为它的所有者。目前,创建用户必须是超级用户。(这个限制是因为错误的操作符类定义可能会混淆甚至使服务器崩溃。)

创建操作员类目前不检查算子类定义是否包括索引方法所需的所有算子和函数,也不检查算子和函数是否形成自洽集。定义一个有效的操作符类是用户的责任。

相关的算子类可以分为运营商家族.要将新的运算符类添加到现有系列,请指定家庭选项在创建操作员类.如果没有此选项,新类将被放入与新类同名的族中(如果该族尚不存在,则创建该族)。

参考第 38.16 节了解更多信息。

# 参数

姓名

要创建的运算符类的名称。该名称可以是模式限定的。

默认

如果存在,操作符类将成为其数据类型的默认操作符类。最多一个运算符类可以是特定数据类型和索引方法的默认值。

数据类型

此运算符类所针对的列数据类型。

索引方法

此运算符类的索引方法的名称。

要将此运算符类添加到的现有运算符族的名称。如果未指定,则使用与运算符类同名的族(如果它不存在,则创建它)。

策略编号

与运算符类关联的运算符的索引方法策略号。

操作员姓名

与运算符类关联的运算符的名称(可选模式限定)。

op_型

在一个操作人员子句,运算符的操作数数据类型,或没有一个表示前缀运算符。在与运算符类的数据类型相同的正常情况下,可以省略操作数数据类型。

在一个作用子句中,如果与函数的输入数据类型(对于B-树比较函数和哈希函数)或类的数据类型(对于B-树排序支持函数、B-树相等映像函数以及GiST、SP GiST、GIN和BRIN运算符类中的所有函数)不同,则函数要支持的操作数数据类型。这些默认值是正确的,因此*op_型*不需要在中指定作用子句,但用于支持跨数据类型比较的B树排序支持函数除外。

按姓氏排序

现有架构的名称(可选架构限定)B树描述与排序运算符关联的排序的运算符族。

如果两者都不是搜寻也没有订购是指定的,搜寻是默认值。

支持号码

与运算符类关联的函数的索引方法支持函数号。

函数名

作为运算符类的索引方法支持函数的函数的名称(可选模式限定)。

参数类型

函数的参数数据类型。

存储类型

实际存储在索引中的数据类型。通常情况下,这与列数据类型相同,但某些索引方法(当前为GiST、GIN、SP GiST和BRIN)允许它有所不同。这个存储除非索引方法允许使用不同的类型,否则必须省略子句。如果列*数据类型指定为任意数组这个存储类型*可以声明为任何元素指示索引项是属于为每个特定索引创建的实际数组类型的元素类型的成员。

这个操作人员, 作用存储子句可以以任何顺序出现。

# 笔记

因为索引机制在使用函数之前不会检查它们的访问权限,所以在操作符类中包含函数或操作符相当于对其授予公共执行权限。对于运算符类中有用的函数类型来说,这通常不是问题。

运算符不应由SQL函数定义。SQL函数可能会内联到调用查询中,这将阻止优化器识别查询是否与索引匹配。

在PostgreSQL 8.4之前操作人员条款可以包括复查选项这不再受支持,因为索引运算符是否“有损”现在是在运行时动态确定的。这样可以有效地处理操作员可能有损或可能没有损的情况。

# 例子

下面的示例命令为数据类型定义了GiST索引运算符类_int4(一系列int4).看内塔雷完整示例的模块。

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);

# 兼容性

创建操作符类是一个PostgreSQL扩展。没有创建操作符类SQL标准中的语句。

# 另见

变换运算符类, 删除运算符类, 创建运算符族, ALTER运算符族