PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

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-tree 比较函数和哈希函数,无需指定 op_type,因为该函数的输入数据类型总是正确的。对于 B-tree 排序支持函数、B-tree 相等映像函数以及 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

该操作符族的新模式。

OPERATOR 和 FUNCTION 子句可以以任意顺序出现。

注记

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

由于索引机制在使用函数之前不会检查其访问权限,把一个函数或操作符包括在操作符族中就等同于向公众授予对它的执行权限。对于在操作符族中有用的那几类函数来说,这通常不是问题。

这些操作符不应当用 SQL 函数来定义。SQL 函数很可能会被内联到调用它的查询中,这会阻止优化器识别出该查询匹配某个索引。

示例

下面的示例命令向一个操作符族中添加了跨数据类型的操作符和支持函数,该操作符族已经包含了数据类型 int4 和 int2 的 B-tree 操作符类。

ALTER OPERATOR FAMILY integer_ops USING btree ADD

  -- int4 vs 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 vs 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 vs 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 vs 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 语句。

另请参阅

CREATE OPERATOR FAMILY, DROP OPERATOR FAMILY, CREATE OPERATOR CLASS, ALTER OPERATOR CLASS, DROP OPERATOR CLASS