CREATE OPERATOR CLASS

Name

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 ) ]
   | FUNCTION support_number [ ( op_type [ , op_type ] ) ] function_name ( argument_type [, ...] )
   | STORAGE storage_type
  } [, ... ]

描述

CREATE OPERATOR CLASS定义一个新的操作符类。 一个操作符类定义一种特定的数据类型如何与一种索引一起使用。 操作符类声明特定的操作符可以为这种数据类型以及这种索引方法填 充特定的角色或者"策略"。操作符类还声明索引方法在为一个索引字段 选定该操作符类的时候要使用的支持过程。所有操作符类使用的函数和 操作符都必须在创建操作符类之前定义。

如果给出了模式名字,那么操作符类就在指定的模式中创建。否则就在 当前模式中创建。在同一个模式中的两个操作符类可以有同样的名字, 但它们必须用于不同的索引方法。

定义操作符类的用户将成为其所有者。目前,创造者必须是超级用户。 作这样的限制是因为一个有问题的操作符类定义会让服务器困惑,甚至崩溃。

CREATE OPERATOR CLASS既不检查这个类定义是否 包含所有索引方法需要的操作符以及函数,也不检查这些操作符和函数 是否形成一个自包含的集合。定义一个合法的操作符类是用户的责任。

相关的操作符类可以被划归到operator families中。 为了添加一个新的操作符类到一个已有族类中,要在 CREATE OPERATOR CLASS中声明FAMILY选项。 没有该选项,新的类被放入与新类同名的族类中(若不存在则创建该族类)。

参考Section 35.14获取更多信息。

参数

name

将要创建的操作符类的名字(可以用模式修饰)。

DEFAULT

表示该操作符类将成为它的数据类型的缺省操作符类。对于某个 数据类型和访问方式而言,最多有一个操作符类是缺省的。

data_type

这个操作符类处理的字段的数据类型。

index_method

这个操作符类处理的索引方法的名字。

family_name

添加操作符类的已有操作符系列的名称。若未声明,会使用与操作符类同名的系列 (若不存在,则创建它)。

strategy_number

一个操作符和这个操作符类关联的索引方法的策略数。

operator_name

一个和该操作符类关联的操作符的名字(可以用模式修饰)。

op_type

OPERATOR条款里,一个操作符的输入数据类型, 或者是NONE表示左目或者右目操作符。通常情况下 可以省略输入数据类型,因为这个时候它们和操作符类的数据类型相同。

FUNCTION子句中,函数打算支持的操作数据类型,若不同于函数 (对于B-tree和hash索引)的输入数据类型或者类的数据类型(对于GIN和GiST索引)。 这些默认值总是正确,因此,在CREATE OPERATOR CLASS中声明一个 FUNCTION子句中的op_type 是没有意义的,但提供该选项是为了与ALTER OPERATOR FAMILY中的 可比较语法保持一致。

support_number

索引方法对一个与操作符类关联的函数的支持过程数。

function_name

一个函数的名字(可以有模式修饰),这个函数是索引方法对此操作符类的支持 过程。

argument_type

函数参数的数据类型。

storage_type

实际存储在索引里的数据类型。通常它和字段数据类型相同,但是一些索引 方法(目前GIN和GiST)允许它是不同的。除非索引方法允许使用一种不同的类型, 否则必须省略STORAGE子句。

OPERATORFUNCTIONSTORAGE子句可以 按照任意顺序出现。

注意

因为索引机制不在使用函数前检查其访问机制,在操作符类中包含操作符或者 函数等价于授权给所有人执行权限。这对于那些用于操作符类的函数通常不会 导致什么问题。

操作符不应该用SQL函数定义。一个SQL函数很可能是内联到调用它的查询里面, 这样将阻止优化器识别这个查询是否可以使用索引。

PostgreSQL8.4之前,OPERATOR子句 可包括RECHECK选项。这不再支持,运维索引操作符是否是 "lossy"现在都是在运行时动态决定的。这允许操作符可能或者不可能被损耗的 cases的高效处理。

例子

下面的例子命令为数据类型_int4(_int4数组) 定义了一个GiST索引操作符类。参阅contrib/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, int, 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这个语句。

又见

ALTER OPERATOR CLASS, DROP OPERATOR CLASS, CREATE OPERATOR FAMILY, ALTER OPERATOR FAMILY