PostgreSQL ALTER OPERATOR FAMILY
ALTER OPERATOR FAMILY — 更改一个操作符族的定义
大纲
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_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
目前不检测操作符族 定义是否包括该索引方法所要求的所有操作符和函数,也不检查操作符和函数是 否形成了一个有理的集合。定义一个合法的操作符族是用户的责任。
进一步的信息请参考第 37.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
-
该操作符族的新模式。
OPERATOR
和FUNCTION
子句可以以任何顺序出现。
注解
注意DROP
语法只通过策略或者支持号以及输入数据类型指定该 操作符族中的“slot”。占用这个槽的操作符或函数的名称不会被提及。 还有,对于DROP FUNCTION
,要指定的类型是该函数意图支持 的输入数据类型。对于 GiST、SP-GiST 以及 GIN 索引,可能无需对该函数的
实际输入参数类型做任何事情。
因为索引机制在使用函数之前不会检查其上的访问权限,包括一个操作符族中的 函数或操作符都等同于授予了其上的公共执行权限。这对于操作符族中很有用的 这类函数来说,这通常不成问题。
操作符应该由 SQL 函数定义。一个 SQL 函数很可能被内联到调用查询中,这将 阻止优化器识别出该查询匹配一个索引。
在PostgreSQL 8.4 之前, OPERATOR
子句可以包括一个RECHECK
选项。这不再 被支持,因为一个索引操作符是否为“lossy”现在会在运行时即时决定。 这允许高效地处理一个操作符可能或者不可能为有损的情况。
示例
下列示例命令为一个操作符族增加跨数据类型的操作符和支持函数,该操 作符族已经包含用于数据类型int4
以及int2
的 B-树 操作符类。
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
语句。