Postgresql 中文操作指南

CREATE OPERATOR CLASS

CREATE OPERATOR CLASS - 定义一个新的运算符类

Synopsis

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

Description

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

如果给出了模式名称,则在指定的模式中创建运算符类。否则,它将在当前模式中创建。同模式中的两个运算符类仅当针对不同的索引方法时才能具有相同的名称。

定义运算符类的用户将成为其所有者。目前,创建用户必须是超级用户。(此限制的目的是由于错误的运算符类定义可能会混淆甚至使服务器崩溃。)

CREATE OPERATOR CLASS 目前不检查运算符类定义是否包含索引方法所需的所有运算符和函数,也不检查运算符和函数是否形成自洽的集合。定义有效的运算符类是用户的责任。

相关的运算符类可以分组到 operator families 中。要将新的运算符类添加到现有系列中,请在其 CREATE OPERATOR CLASS 中指定 FAMILY 选项。如果没有此选项,则新类将放入一个与新类同名的系列中(如果它不存在,则会创建该系列)。

有关更多信息,请参阅 Section 38.16

Parameters

  • 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 SEARCHFOR ORDER BY ,则 FOR SEARCH 为默认值。

  • support_number

    • 索引方法支持函数编号,用于与操作符类关联的函数。

  • function_name

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

  • argument_type

    • 函数的参数数据类型。

  • storage_type

    • 实际存储在索引中的数据类型。通常与列数据类型相同,但某些索引方法(当前为 GiST、GIN、SP-GISt 和 BRIN)允许不同。除非索引方法允许使用不同类型,否则必须省略 STORAGE 子句。如果将列 data_type 指定为 anyarray ,则可以将 storage_type 声明为 anyelement ,以指示索引项属于与每个特定索引在创建时所属的实际数组类型对应的元素类型。

OPERATORFUNCTIONSTORAGE 子句可以按任何顺序出现。

Notes

由于索引机制在使用函数之前不会检查函数的访问权限,因此在操作符类中包含函数或操作符等同于授予对其公共执行权限。对于在操作符类中很有用的函数类型通常这不是问题。

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

在 PostgreSQL 8.4 之前, OPERATOR 子句可以包含 RECHECK 选项。不再支持此选项,因为索引运算符是“有损”的,现在在运行时动态确定。这允许高效处理运算符可能是有损或无损的情况。

Examples

以下示例命令定义了数据类型 _int4int4 的数组)的 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);

Compatibility

CREATE OPERATOR CLASS 是 PostgreSQL 扩展。SQL 标准中没有 CREATE OPERATOR CLASS 语句。