选择 打开 改范围 完整检索页
受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10
当前 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
  } [, ... ]

描述

CREATE OPERATOR CLASS创建一个新的操作符类。 操作符类定义特定数据类型如何与索引一起使用。它规定某些操作符在该 数据类型和该索引方法中承担特定角色或策略。当某个索引 列选择了该操作符类时,操作符类还会指定索引方法要使用哪些支持函数。 操作符类使用的所有操作符和函数都必须先定义好,然后才能创建该操作 符类。

如果给出了一个模式名称,那么该操作符类会被创建在指定模式中。否则,它 会被创建在当前模式中。同一模式中的两个操作符类只有在被用于不同的索引 方法时才可以具有相同的名称。

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

CREATE OPERATOR CLASS当前不会检查操作符 类定义是否包括该索引方法所要求的所有操作符和函数,也不会检查这些操作符 和函数是否构成一个自洽的集合。定义一个合法的操作符类是用户的责任。

相关的操作符类可以分组为操作符族。要把一个新的 操作符类加入现有操作符族,可以在CREATE OPERATOR CLASS中指定FAMILY选项。如果没有这个选项, 新类会被放入一个与其同名的操作符族中(如果该操作符族尚不存在,就会创 建它)。

进一步的信息可参考Section 37.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 和 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语句。