阅读(2337) (10)

PostgreSQL CREATE OPERATOR CLASS

2021-08-23 14:27:06 更新

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选项。如果没有这个选项, 新的类会被放到一个同名的族中(如果族不存在会创建之)。

进一步的信息可参考第 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 操作符类中的函数)不同。这些默认值是正确的,并且 op_type因此不必 在FUNCTION子句中被指定,对于 B-树排序支持函数的情 况来说,这表示跨数据类型比较。

sort_family_name

一个现有btree操作符族的名称(可以是模式限定的), 它描述与一种排序操作符相关联的排序顺序。

如果FOR SEARCHFOR 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语句。