文档

CREATE OPERATOR CLASS

更新时间:

CREATE OPERATOR CLASS用于创建新的操作符类。

简介

CREATE OPERATOR CLASS创建新的操作符类。 一个操作符类定义一种特殊的数据类型如何被用于一个索引。操作符类指定为该数据类型和索引方法扮演特殊角色或者“策略”的操作符。操作符类还指定当该操作符类被选择用于一个索引列时,索引方法要使用的支持函数。 操作符类所使用的所有操作符和函数必须在操作符类被创建之前被定义好。

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

定义操作符类的用户将成为其拥有者。当前,创建用户必须是超级用户(做出这种限制是因为错误的操作符类定义会让服务器混淆甚至崩溃)。

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

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

语法

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

参数

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 函数很有可能会被内联到调用查询中,这会妨碍优化器识别该查询匹配一个索引。

示例

为数据类型_int4int4数组) 定义了一个 GiST 索引操作符。

    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);
  • 本页导读 (0)
文档反馈