↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

百科 / SQL 命令 / 类型与运算符

SQL COMMAND · 类型与运算符

CREATE OPERATOR CLASS

定义一个新的操作符类

define a new operator class

CREATE类型与运算符引入 7.3现存至 20 devel5 次语法变更

动词
CREATE
对象
OPERATOR CLASS
引入版本
7.3
状态
现存
语法变更次数
5
手册小节数
6

本站手册 · 18官方文档 ↗

版本轨迹

相对 PostgreSQL 17 语法未变,正文有更新。

语法铁道图 PostgreSQL 18

沿轨道从左向右阅读,分岔表示选择,绕行表示可选,回环表示重复。方框为参数,点击带下划线的参数可展开子规则。

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

PostgreSQL 18 手册 · 查看完整参考页

描述

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-树比较函数和 hash 函数),或者不同于该类的数据类型(对于 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,以表明索引条目属于每个特定索引所针对的实际数组类型的元素类型。

OPERATOR、FUNCTION 和 STORAGE 子句可以以任何顺序出现。

注解

因为索引机制在使用函数之前不会检查函数的访问权限,将一个函数或者操作符包括在一个操作符类中,相当于授予其公共执行权限。对适合放入操作符类的那类函数而言,这通常不是问题。

操作符不应该由 SQL 函数定义。SQL 函数很可能会被内联到调用查询中,这会妨碍优化器识别该查询匹配一个索引。

示例

下面的示例为数据类型_int4(int4 数组)定义了一个 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 语句。

另见

语法演化

相邻大版本之间的差异,新的在前。版本号链接到对应快照。

  1. PostgreSQL 18← 17正文更新

    正文更新
  2. PostgreSQL 17← 16正文更新

    正文更新
  3. PostgreSQL 14← 13正文更新

    正文更新
  4. PostgreSQL 13← 12正文更新

    正文更新
  5. PostgreSQL 12← 11正文更新

    正文更新
  6. PostgreSQL 11← 10正文更新

    正文更新
  7. PostgreSQL 10← 9.6正文更新

    正文更新
  8. PostgreSQL 9.6← 9.5正文更新

    正文更新
  9. PostgreSQL 9.5← 9.4正文更新

    正文更新
  10. PostgreSQL 9.2← 9.1正文更新

    正文更新
  11. PostgreSQL 9.1← 9.0语法变化

    + { OPERATOR strategy_number operator_name [ ( op_type, op_type ) ] [ FOR SEARCH | FOR ORDER BY sort_family_name ]正文更新
  12. PostgreSQL 9.0← 8.4语法变化

    + | FUNCTION support_number [ ( op_type [ , op_type ] ) ] function_name ( argument_type [, ...] )− | FUNCTION support_number [ ( op_type [ , op_type ] ) ] funcname ( argument_type [, ...] )正文更新
  13. PostgreSQL 8.4← 8.3语法变化

    − { OPERATOR strategy_number operator_name [ ( op_type, op_type ) ] [ RECHECK ]正文更新
  14. PostgreSQL 8.3← 8.2语法变化

    + USING index_method [ FAMILY family_name ] AS+ | FUNCTION support_number [ ( op_type [ , op_type ] ) ] funcname ( argument_type [, ...] )正文更新
  15. PostgreSQL 8.2← 8.1正文更新

    正文更新
  16. PostgreSQL 8.1← 8.0正文更新

    正文更新
  17. PostgreSQL 8.0← 7.4正文更新

    正文更新
  18. PostgreSQL 7.4← 7.3语法变化

    + CREATE OPERATOR CLASS name [ DEFAULT ] FOR TYPE data_type USING index_method AS+ { OPERATOR strategy_number operator_name [ ( op_type, op_type ) ] [ RECHECK ]+ | FUNCTION support_number funcname ( argument_type [, ...] )− CREATE OPERATOR CLASS name [ DEFAULT ] FOR TYPE data_type USING access_method AS− { OPERATOR strategy_number operator_id [ ( type, type ) ] [ RECHECK ]− | FUNCTION support_number func_name ( parameter_types )正文更新
  19. PostgreSQL 7.3← 7.2新增此命令

同组命令

命令动词对象版本变动最近变更
TYPES & OPERATORS类型与运算符23 条↑
CREATE CASTCREATECAST 104 次
定义一种新的类型转换现存
DROP CASTDROPCAST 9.02 次
移除一个类型转换现存
CREATE COLLATIONCREATECOLLATION 163 次
定义一种新排序规则现存
ALTER COLLATIONALTERCOLLATION 143 次
更改排序规则的定义现存
DROP COLLATIONDROPCOLLATION —
删除一个排序规则现存
CREATE CONVERSIONCREATECONVERSION 9.02 次
定义一个新的编码转换现存
ALTER CONVERSIONALTERCONVERSION 145 次
更改一个转换的定义现存
DROP CONVERSIONDROPCONVERSION 8.22 次
移除一个转换现存
CREATE DOMAINCREATEDOMAIN 174 次
定义一个新域现存
ALTER DOMAINALTERDOMAIN 145 次
更改一个域的定义现存
DROP DOMAINDROPDOMAIN 8.22 次
移除一个域现存
CREATE OPERATORCREATEOPERATOR 198 次
定义一个新的操作符现存
ALTER OPERATORALTEROPERATOR 176 次
更改一个操作符的定义现存
DROP OPERATORDROPOPERATOR 148 次
移除一个操作符现存
CREATE OPERATOR CLASSCREATEOPERATOR CLASS 9.15 次
定义一个新的操作符类现存
ALTER OPERATOR CLASSALTEROPERATOR CLASS 145 次
更改一个操作符类的定义现存
DROP OPERATOR CLASSDROPOPERATOR CLASS 8.22 次
移除一个操作符类现存
CREATE OPERATOR FAMILYCREATEOPERATOR FAMILY —
定义一个新的操作符族现存
ALTER OPERATOR FAMILYALTEROPERATOR FAMILY 146 次
更改一个操作符族的定义现存
DROP OPERATOR FAMILYDROPOPERATOR FAMILY —
移除一个操作符族现存
CREATE TYPECREATETYPE 1413 次
定义一种新数据类型现存
ALTER TYPEALTERTYPE 148 次
更改类型的定义现存
DROP TYPEDROPTYPE 8.24 次
移除一个数据类型现存