CREATE OPERATOR CLASS — 定义一个新的操作符类
CREATE OPERATOR CLASSname
[ DEFAULT ] FOR TYPEdata_type
USINGindex_method
[ FAMILYfamily_name
] AS { OPERATORstrategy_number
operator_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 树比较函数和哈希函数)或类的的数据类型(对于 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 函数很可能会被内联到调用查询中,这将阻止优化器识别查询与索引匹配。
在 PostgreSQL 8.4 之前,OPERATOR
子句可以包含 RECHECK
选项。这不再受支持,因为索引操作符是否“有损”现在是在运行时动态确定的。这允许高效处理操作符可能或可能不是有损的情况。
以下示例命令为数据类型 _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
语句。
如果您在文档中看到任何不正确、与您使用特定功能的经验不符或需要进一步澄清的内容,请使用此表格报告文档问题。