受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

ALTER OPERATOR FAMILY

ALTER OPERATOR FAMILY — 更改一个操作符族的定义

Synopsis

ALTER OPERATOR FAMILY name USING index_method ADD
  {  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 [, ...] ) ]
  } [, ... ]

ALTER OPERATOR FAMILY name USING index_method DROP
  {  OPERATOR strategy_number ( op_type [ , op_type ] )
   | FUNCTION support_number ( op_type [ , op_type ] )
  } [, ... ]

ALTER OPERATOR FAMILY name USING index_method
    RENAME TO new_name

ALTER OPERATOR FAMILY name USING index_method
    OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }

ALTER OPERATOR FAMILY name USING index_method
    SET SCHEMA new_schema

描述

ALTER OPERATOR FAMILY更改一个操作符族的定义。 你可以向该族添加操作符和支持函数、从该族中移除它们,或者更改该族的 名称或拥有者。

使用ALTER OPERATOR FAMILY向一个族中添加操作符和 支持函数时,它们并不属于该族内任何特定的操作符类,而只是作为该族中的 松散成员存在。这表明这些操作符和函数与该族的语义兼容, 但并不是任何特定索引正确工作所必需的。(那些确实必需的操作符和函数应当 声明为某个操作符类的一部分;参见CREATE OPERATOR CLASS。) PostgreSQL允许随时从一个族中删除松散成员, 但如果不删除整个类以及依赖它的任何索引,就不能删除操作符类的成员。 通常,单一数据类型的操作符和函数属于操作符类,因为支持该特定数据类型上的 索引需要它们,而跨数据类型的操作符和函数则作为该族中的松散成员。

要使用ALTER OPERATOR FAMILY,你必须是超级用户。 (之所以这样限制,是因为错误的操作符族定义可能会使服务器混乱,甚至导致 崩溃。)

ALTER OPERATOR FAMILY目前不会检查操作符族定义 是否包括该索引方法所要求的全部操作符和函数,也不会检查这些操作符和函数 是否构成一个自洽的集合。定义一个合法的操作符族是用户的责任。

更多信息请参见Section 36.16

参数

name #

一个现有操作符族的名称(可以是模式限定的)。

index_method #

该操作符族所对应的索引方法名称。

strategy_number #

与该操作符族关联的操作符的索引方法策略号。

operator_name #

与该操作符族关联的操作符名称(可以是模式限定的)。

op_type #

OPERATOR子句中,表示该操作符的操作数数据类型, 或者用NONE表示一个前缀操作符。不同于 CREATE OPERATOR CLASS中的对应语法,操作数数据 类型必须始终显式指定。

ADD FUNCTION子句中,如果该函数要支持的操作数 数据类型不同于它的输入数据类型,则在此指定。对于 B-树比较函数和哈希 函数,不必指定op_type, 因为函数的输入数据类型始终就是应使用的正确类型。对于 B-树排序支持 函数、B-树等值图像函数,以及 GiST、SP-GiST 和 GIN 操作符类中的所有 函数,则必须指定该函数要配合使用的操作数数据类型。

DROP FUNCTION子句中,必须指定该函数意图支持的 操作数数据类型。

sort_family_name #

一个现有btree操作符族的名称(可以是模式限定的), 它描述与某个排序操作符关联的排序顺序。

如果既没有指定FOR SEARCH,也没有指定 FOR ORDER BY,则默认值是FOR SEARCH

support_number #

与该操作符族关联的函数的索引方法支持函数编号。

function_name #

作为该操作符族索引方法支持函数的函数名称(可以是模式限定的)。如果 没有指定参数列表,则该名称在其模式中必须唯一。

argument_type #

该函数的参数数据类型。

new_name #

该操作符族的新名称。

new_owner #

该操作符族的新拥有者。

new_schema #

该操作符族所在的新模式。

OPERATORFUNCTION子句可以以任何顺序出现。

注解

注意,DROP语法只通过策略号或支持函数编号以及输入数据 类型来指定操作符族中的槽位,不会提及占用该槽位的操作符 或函数名称。另外,对于DROP FUNCTION,要指定的类型是 该函数意图支持的输入数据类型;对于 GiST、SP-GiST 和 GIN 索引,这些类型 可能与该函数实际的输入参数类型毫无关系。

因为索引机制在使用函数之前不会检查函数的访问权限,将一个函数或者操作符 包括在一个操作符族中相当于在其上授予公共执行权限。这对操作符族中很有用 的这类函数来说通常不成问题。

操作符不应该由 SQL 函数定义。SQL 函数很可能会被内联到调用查询中,这会 妨碍优化器识别该查询匹配一个索引。

示例

下列示例命令向一个已经包含数据类型int4int2 的 B-树操作符类的操作符族中添加跨数据类型的操作符和支持函数。

ALTER OPERATOR FAMILY integer_ops USING btree ADD

  -- int4 对 int2
  OPERATOR 1 < (int4, int2) ,
  OPERATOR 2 <= (int4, int2) ,
  OPERATOR 3 = (int4, int2) ,
  OPERATOR 4 >= (int4, int2) ,
  OPERATOR 5 > (int4, int2) ,
  FUNCTION 1 btint42cmp(int4, int2) ,

  -- int2 对 int4
  OPERATOR 1 < (int2, int4) ,
  OPERATOR 2 <= (int2, int4) ,
  OPERATOR 3 = (int2, int4) ,
  OPERATOR 4 >= (int2, int4) ,
  OPERATOR 5 > (int2, int4) ,
  FUNCTION 1 btint24cmp(int2, int4) ;

要再次移除这些条目:

ALTER OPERATOR FAMILY integer_ops USING btree DROP

  -- int4 对 int2
  OPERATOR 1 (int4, int2) ,
  OPERATOR 2 (int4, int2) ,
  OPERATOR 3 (int4, int2) ,
  OPERATOR 4 (int4, int2) ,
  OPERATOR 5 (int4, int2) ,
  FUNCTION 1 (int4, int2) ,

  -- int2 对 int4
  OPERATOR 1 (int2, int4) ,
  OPERATOR 2 (int2, int4) ,
  OPERATOR 3 (int2, int4) ,
  OPERATOR 4 (int2, int4) ,
  OPERATOR 5 (int2, int4) ,
  FUNCTION 1 (int2, int4) ;

兼容性

在 SQL 标准中没有 ALTER OPERATOR FAMILY语句。

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。