创建操作员班

创建操作员类别—定义新的操作员类别

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 family *。要将新的操作员类别添加到现有系列中,请在CREATE OPERATOR CLASS中指定FAMILY选项。如果没有此选项,则将新类放置到与新类相同的族中(如果该族尚不存在,则创建该族)。

有关更多信息,请参考Section 37.14

Parameters

  • name

    • 要创建的操作员类别的名称。该名称可以是模式限定的。
  • DEFAULT

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

    • 此运算符类的列数据类型。
  • index_method

    • 此运算符类用于的索引方法的名称。
  • family_name

    • 要添加此操作符类的现有操作符族的名称。如果未指定,则使用与操作符类相同的名称族(如果尚不存在,则创建它)。
  • strategy_number

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

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

    • OPERATOR子句中,运算符的操作数数据类型,或NONE表示左一元或右一元运算符。在正常情况下,与操作符类的数据类型相同时,可以省略操作数数据类型。

FUNCTION子句中,函数要支持的操作数数据类型(如果不同于函数的 Importing 数据类型(对于 B 树比较函数和哈希函数)或类的数据类型(对于 B 树排序支持功能以及 GiST,SP-GiST,GIN 和 BRIN 运算符类中的所有功能)。这些默认值是正确的,因此FUNCTION子句中无需指定* op_type *,除非 B 树排序支持功能旨在支持跨数据类型比较。

  • sort_family_name

    • 现有的btree运算符系列的名称(可选,由模式限定),该名称描述与排序运算符关联的排序 Sequences。

如果既未指定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,以指示索引条目是属于为每个特定索引创建的实际数组类型的元素类型的成员。

OPERATORFUNCTIONSTORAGE子句可以按任何 Sequences 出现。

Notes

因为索引机制在使用函数之前不会检查对函数的访问权限,所以在运算符类中包括函数或运算符就等于授予对其的公共执行权限。对于运算符类中有用的各种函数,通常这不是问题。

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

在 PostgreSQL 8.4 之前,OPERATOR子句可以包含RECHECK选项。不再支持此操作,因为现在可以在运行时即时确定索引运算符是否“有损”。这样可以有效地处理操作员可能会或可能不会有损失的情况。

Examples

以下示例命令为数据类型_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);

Compatibility

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

See Also

变更操作员类别, 降落操作员班, 创建运算符家庭, 运算符家族