创建操作符类
CREATE OPERATOR CLASS — 定义一个新的操作符类
概要
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
创建一个新的操作符类。操作符类定义如何将特定数据类型与索引一起使用。操作符类指定某些操作符将填充特定角色或“策略”以用于此数据类型和此索引方法。操作符类还指定当为索引列选择操作符类时索引方法要使用的支持函数。在创建操作符类之前,必须定义操作符类使用的所有操作符和函数。
如果给出了模式名称,则在指定模式中创建操作符类。否则,在当前模式中创建。同一模式中的两个操作符类只有在针对不同的索引方法时才能具有相同的名称。
定义操作符类的用户将成为其所有者。目前,创建用户必须是超级用户。(此限制是因为错误的操作符类定义可能会造成服务器混乱甚至崩溃。)
CREATE OPERATOR CLASS
目前不检查操作符类定义是否包含索引方法所需的所有操作符和函数,也不检查操作符和函数是否形成自洽的集合。定义有效操作符类是用户的责任。
相关的操作符类可以分组到操作符族中。要将新的操作符类添加到现有族中,请在CREATE OPERATOR CLASS
中指定FAMILY
选项。如果没有此选项,则新类将被置于与新类同名的族中(如果该族不存在,则创建该族)。
请参阅第 38.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 操作符类中的所有函数)。这些默认值是正确的,因此op_type
不需要在FUNCTION
子句中指定,除了旨在支持跨数据类型比较的 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 函数可能会内联到调用查询中,这将阻止优化器识别查询是否与索引匹配。
在PostgreSQL8.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
语句。
另请参阅
ALTER OPERATOR CLASS、DROP OPERATOR CLASS、CREATE OPERATOR FAMILY、ALTER OPERATOR FAMILY