🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# CREATE OPERATOR CLASS ## Name CREATE OPERATOR CLASS -- 定义一个新操作符类 ## Synopsis ``` 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`选项。 没有这个选项,新建的类会放置到与它同名的族中(如果不存在则创建它)。 参考[Section 35.14](#calibre_link-54)获取更多信息。 ## 参数 `_name_` 将要创建的操作符类的名字(可以用模式修饰)。 `DEFAULT` 表示该操作符类将成为它的数据类型的缺省操作符类。 对于某个数据类型和访问方式而言,最多有一个操作符类是缺省的。 `_data_type_` 这个操作符类处理的字段的数据类型。 `_index_method_` 这个操作符类处理的索引方法的名字。 `_family_name_` 这个操作符类添加到的现有操作符族的名字。如果没有指定, 则使用与该操作符类相同名字的操作符族(如果不存在则创建它)。 `_strategy_number_` 一个操作符和这个操作符类关联的索引方法的策略数。 `_operator_name_` 一个和该操作符类关联的操作符的名字(可以用模式修饰)。 `_op_type_` 在`OPERATOR`子句中,该操作符的操作数的数据类型, 或者是`NONE`表示左目或者右目操作符。 通常情况下可以省略操作数的数据类型,因为这个时候它们和操作符类的数据类型相同。 在`FUNCTION`子句中,如果函数的操作数数据类型和函数的输入数据类型 (对于B-tree比较函数和哈希函数)或类的数据类型 (对于B-tree排序支持函数和所有在GiST、SP-GiST和GIN操作符类中的函数)不同, 那么就在该子句中写上这个函数要支持的操作数类型。这些缺省是正确的, 因此`_op_type_` 不需要在`FUNCTION`子句中指定, 除了B-tree排序支持函数支持交叉数据类型比较的情况。 `_sort_family_name_` 描述与排序操作符相关的排序顺序的现有`btree` 操作符族的名字(可以有模式修饰)。 如果既没有指定`FOR SEARCH`,也没有指定`FOR ORDER BY`, 那么缺省是`FOR SEARCH`。 `_support_number_` 索引方法对一个与操作符类关联的函数的支持过程数 `_function_name_` 一个函数的名字(可以有模式修饰),这个函数是索引方法对此操作符类的支持过程。 `_argument_type_` 函数参数的数据类型。 `_storage_type_` 实际存储在索引里的数据类型。通常它和字段数据类型相同, 但是一些索引方法(目前是GiST和GIN)允许它是不同的。 除非索引方法允许使用一种不同的类型,否则必须省略`STORAGE`子句。 `OPERATOR`、`FUNCTION`和`STORAGE` 子句可以按照任意顺序出现。 ## 注意 因为索引机制不在使用函数前检查其访问机制, 在操作符类中包含操作符或者函数等价于授权给所有人执行权限。 这对于那些用于操作符类的函数通常不会导致什么问题。 操作符不应该用 SQL 函数定义。一个 SQL 函数很可能是内联到调用它的查询里面, 这样将阻止优化器识别这个查询是否可以使用索引。 PostgreSQL 8.4之前,`OPERATOR` 子句可以包括`RECHECK`选项。现在不再支持了, 因为一个索引操作符是否是"有损耗的",现在是在运行时动态确定。 这允许高效的处理操作符有或没有损耗的情况。 ## 例子 下面的例子命令为数据类型`_int4`(`int4`数组) 定义了一个 GiST 索引操作符类。参阅[intarray](#calibre_link-384)模块获取完整的例子。 ``` 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, int, 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标准中没有这个语句。 ## 又见 [ALTER OPERATOR CLASS](#calibre_link-57), [DROP OPERATOR CLASS](#calibre_link-58), [CREATE OPERATOR FAMILY](#calibre_link-11), [ALTER OPERATOR FAMILY](#calibre_link-55)