SQL COMMAND · 类型与运算符
CREATE OPERATOR CLASS
定义一个新的操作符类
CREATE类型与运算符引入 10(基线)现存至 20 devel0 次语法变更
- 动词
CREATE- 对象
OPERATOR CLASS- 分组
- 类型与运算符
- 引入版本
- 10(基线)
- 状态
- 现存
- 语法变更次数
- 0
- 手册小节数
- 6
版本轨迹
相对 PostgreSQL 17 语法未变,正文有更新。
语法铁道图 PostgreSQL 18
沿轨道从左向右阅读,分岔表示选择,绕行表示可选,回环表示重复。方框为参数,点击带下划线的参数可展开子规则。
语法概要
CREATE OPERATOR CLASSname[ DEFAULT ] FOR TYPEdata_typeUSINGindex_method[ FAMILYfamily_name] AS { OPERATORstrategy_numberoperator_name[ (op_type,op_type) ] [ FOR SEARCH | FOR ORDER BYsort_family_name] | FUNCTIONsupport_number[ (op_type[ ,op_type] ) ]function_name(argument_type[, ...] ) | STORAGEstorage_type} [, ... ]
描述
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语句。
另见
语法演化
相邻大版本之间的差异,新的在前。版本号链接到对应快照。
PostgreSQL 20← 19正文更新
正文更新PostgreSQL 18← 17正文更新
正文更新PostgreSQL 17← 16正文更新
正文更新PostgreSQL 14← 13正文更新
正文更新PostgreSQL 13← 12正文更新
正文更新PostgreSQL 12← 11正文更新
正文更新PostgreSQL 11← 10正文更新
正文更新
同组命令
| 命令 | 动词 | 对象 | 版本变动 | 最近变更 |
|---|---|---|---|---|
CREATE CAST | CREATE | CAST | — | |
| 定义一种新的类型转换 | 现存 | |||
DROP CAST | DROP | CAST | — | |
| 移除一个类型转换 | 现存 | |||
CREATE COLLATION | CREATE | COLLATION | 162 次 | |
| 定义一种新排序规则 | 现存 | |||
ALTER COLLATION | ALTER | COLLATION | 141 次 | |
| 更改排序规则的定义 | 现存 | |||
DROP COLLATION | DROP | COLLATION | — | |
| 删除一个排序规则 | 现存 | |||
CREATE CONVERSION | CREATE | CONVERSION | — | |
| 定义一个新的编码转换 | 现存 | |||
ALTER CONVERSION | ALTER | CONVERSION | 141 次 | |
| 更改一个转换的定义 | 现存 | |||
DROP CONVERSION | DROP | CONVERSION | — | |
| 移除一个转换 | 现存 | |||
CREATE DOMAIN | CREATE | DOMAIN | 171 次 | |
| 定义一个新域 | 现存 | |||
ALTER DOMAIN | ALTER | DOMAIN | 142 次 | |
| 更改一个域的定义 | 现存 | |||
DROP DOMAIN | DROP | DOMAIN | — | |
| 移除一个域 | 现存 | |||
CREATE OPERATOR | CREATE | OPERATOR | 192 次 | |
| 定义一个新的操作符 | 现存 | |||
ALTER OPERATOR | ALTER | OPERATOR | 172 次 | |
| 更改一个操作符的定义 | 现存 | |||
DROP OPERATOR | DROP | OPERATOR | 141 次 | |
| 移除一个操作符 | 现存 | |||
CREATE OPERATOR CLASS | CREATE | OPERATOR CLASS | — | |
| 定义一个新的操作符类 | 现存 | |||
ALTER OPERATOR CLASS | ALTER | OPERATOR CLASS | 141 次 | |
| 更改一个操作符类的定义 | 现存 | |||
DROP OPERATOR CLASS | DROP | OPERATOR CLASS | — | |
| 移除一个操作符类 | 现存 | |||
CREATE OPERATOR FAMILY | CREATE | OPERATOR FAMILY | — | |
| 定义一个新的操作符族 | 现存 | |||
ALTER OPERATOR FAMILY | ALTER | OPERATOR FAMILY | 141 次 | |
| 更改一个操作符族的定义 | 现存 | |||
DROP OPERATOR FAMILY | DROP | OPERATOR FAMILY | — | |
| 移除一个操作符族 | 现存 | |||
CREATE TYPE | CREATE | TYPE | 141 次 | |
| 定义一种新数据类型 | 现存 | |||
ALTER TYPE | ALTER | TYPE | 142 次 | |
| 更改类型的定义 | 现存 | |||
DROP TYPE | DROP | TYPE | — | |
| 移除一个数据类型 | 现存 | |||