===================== CREATE OPERATOR CLASS ===================== .. container:: refentry :name: SQL-CREATEOPCLASS .. container:: titlepage .. container:: refnamediv .. rubric:: CREATE OPERATOR CLASS :name: create-operator-class CREATE OPERATOR CLASS — 定义一个新的操作符类 .. container:: refsynopsisdiv .. rubric:: 大纲 :name: 大纲 .. code:: 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 } [, ... ] .. container:: refsect1 :name: id-1.9.3.73.5 .. rubric:: 描述 :name: 描述 ``CREATE OPERATOR CLASS``\ 创建新的操作符类。 一个操作符类定义一种特殊的数据类型如何被用于一个索引。操作符类指定为 该数据类型和索引方法扮演特殊角色或者“策略”的操作符。操作符 类还指定当该操作符类被选择用于一个索引列时,索引方法要使用的支持函数。 操作符类所使用的所有操作符和函数必须在操作符类被创建之前被定义好。 如果给出了一个模式名称,那么该操作符类会被创建在指定模式中。否则,它 会被创建在当前模式中。同一模式中的两个操作符类只有在被用于不同的索引 方法时才可以具有相同的名称。 定义操作符类的用户将成为其拥有者。当前,创建用户必须是超级用户(做出 这种限制是因为错误的操作符类定义会让服务器混淆甚至崩溃)。 ``CREATE OPERATOR CLASS``\ 当前不会检查操作符 类定义是否包括该索引方法所要求的所有操作符和函数,也不会检查这些操作符 和函数是否构成一个一致的集合。定义一个合法的操作符类是用户的责任。 相关的操作符类可以被组成\ *操作符族*\ 。要把一个新的操作符类 加入到一个现有的族中,可以在\ ``CREATE OPERATOR CLASS``\ 中指定\ ``FAMILY``\ 选项。如果没有这个选项, 新的类会被放到一个同名的族中(如果族不存在会创建之)。 .. container:: refsect1 :name: id-1.9.3.73.6 .. rubric:: 参数 :name: 参数 .. container:: variablelist ``name`` 要创建的操作符类的名称。该名称可以被模式限定。 ``DEFAULT`` 如果存在,该操作符类将成为其数据类型的默认操作符类。对一种 特定的数据类型和索引方法至多有一个默认操作符类。 ``data_type`` 这个操作符类所用于的列数据类型。 ``index_method`` 这个操作符类所用于的索引方法的名称。 ``family_name`` 要把这个操作符类加入其中的已有操作符族的名称。如果没有指定, 将使用一个同名操作符族(如果还不存在则创建之)。 ``strategy_number`` 用于一个与该操作符类相关联的操作符的索引方法策略号。 ``operator_name`` 一个与该操作符类相关联的操作符的名称(可以被模式限定)。 ``op_type`` 在一个\ ``OPERATOR``\ 子句中,这表示该操作符的操作数数据 类型,或者用\ ``NONE``\ 来表示一个左一元或者右一元操作符。 在操作数数据类型与该操作符的数据类型相同的一般情况下,操作数的 数据类型可以被省略。 在一个\ ``FUNCTION``\ 子句中,这表示该函数要支持的操作数 数据类型,如果它与该函数的输入数据类型(对于 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 和 BRIN)允许它们不同。 除非索引方法允许使用不同的类型,\ ``STORAGE``\ 子句必须 被省略。 如果\ ``data_type``\ 列被指定为\ ``anyarray``\ , 那么\ ``storage_type``\ 可以被声明为\ ``anyelement`` 以指示索引条目是属于为每个特定索引创建的实际数组类型的元素类型的成员。 ``OPERATOR``\ 、\ ``FUNCTION``\ 和\ ``STORAGE`` 子句可以以任何顺序出现。 .. container:: refsect1 :name: id-1.9.3.73.7 .. rubric:: 注解 :name: 注解 因为索引机制在使用函数之前不检查它们的权限,将一个函数或者操作符包括在 一个操作符类中相当于在其上授予公共执行权限。这对操作符类中很有用的函数 来说通常不成问题。 操作符不应该用 SQL 函数定义。SQL 函数很有可能会被内联到调用查询中,这 会妨碍优化器识别该查询匹配一个索引。 .. container:: refsect1 :name: id-1.9.3.73.8 .. rubric:: 示例 :name: 示例 下面的例子为数据类型\ ``_int4``\ (\ ``int4``\ 数组) 定义了一个 GiST 索引操作符。完整的例子请见 `intarray `__\ 模块。 .. code:: programlisting 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); .. container:: refsect1 :name: id-1.9.3.73.9 .. rubric:: 兼容性 :name: 兼容性 ``CREATE OPERATOR CLASS``\ 是一种 OushuDB扩展。在 SQL 标准中没有 ``CREATE OPERATOR CLASS``\ 语句。 .. container:: refsect1 :name: id-1.9.3.73.10 .. rubric:: 另见 :name: 另见 `ALTER OPERATOR CLASS `__, `DROP OPERATOR CLASS `__, `CREATE OPERATOR FAMILY `__, `ALTER OPERATOR FAMILY `__