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 节。
名称
要创建的运算符类的名称。该名称可以有模式限定。
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 树排序支持函数除外,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
语句。