支持的版本:当前17)/ 16 / 15 / 14 / 13
开发版本:devel
不支持的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3

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 选项。如果没有此选项,则新类将被放置在与新类同名的族中(如果该族尚不存在,则创建该族)。

有关更多信息,请参阅第 36.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、SP-GiST 和 BRIN)允许它不同。除非索引方法允许使用不同的类型,否则必须省略 STORAGE 子句。如果将列data_type指定为 anyarray,则可以将storage_type声明为 anyelement,以指示索引条目是属于为每个特定索引创建的实际数组类型的元素类型的成员。

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

注意

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

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

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

示例

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

兼容性

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

提交更正

如果您在文档中发现任何不正确、与您使用特定功能的体验不符或需要进一步澄清的地方,请使用此表单报告文档问题。