ALTER OPERATOR FAMILY — 更改一个操作符族的定义
ALTER OPERATOR FAMILYname
USINGindex_method
ADD { OPERATORstrategy_number
operator_name
(op_type
,op_type
) [ FOR SEARCH | FOR ORDER BYsort_family_name
] | FUNCTIONsupport_number
[ (op_type
[ ,op_type
] ) ]function_name
[ (argument_type
[, ...] ) ] } [, ... ] ALTER OPERATOR FAMILYname
USINGindex_method
DROP { OPERATORstrategy_number
(op_type
[ ,op_type
] ) | FUNCTIONsupport_number
(op_type
[ ,op_type
] ) } [, ... ] ALTER OPERATOR FAMILYname
USINGindex_method
RENAME TOnew_name
ALTER OPERATOR FAMILYname
USINGindex_method
OWNER TO {new_owner
| CURRENT_USER | SESSION_USER } ALTER OPERATOR FAMILYname
USINGindex_method
SET SCHEMAnew_schema
ALTER OPERATOR FAMILY
更改一个操作符族
的定义。你能增加操作符以及支持函数到该家族、从该族中移除它们或者更改
该族的名称或者拥有者。
在用ALTER OPERATOR FAMILY
增加操作符和
支持函数到一个族中时,它们不是族内任何特定操作符类的组成部分,而只是
“松散”地存在于该族中。这表示这些操作符和函数与该族的语义兼
容,但是没有被任何特定索引的正确功能所要求(所要求的操作符和函数应该
被作为一个操作符类的一部分声明,见CREATE OPERATOR CLASS)。
PostgreSQL将允许一个族的松散成员在
任何时候被从该族中删除,但是在删除一个操作符类的成员之前,必须已经删
除整个类以及依赖于该成员的索引。具有代表性的是,单一数据类型操作符和
函数是操作符类的一部分,因为在特定数据类型上的索引需要它们的支持。而
多数据类型操作符和函数则被作为该族的松散成员。
要使用ALTER OPERATOR FAMILY
,你必须是超级用户(
做这样的限制是因为一个错误的操作符族定义可能会迷惑服务器甚至让它崩溃)。
ALTER OPERATOR FAMILY
目前不检测操作符族
定义是否包括该索引方法所要求的所有操作符和函数,也不检查操作符和函数是
否形成了一个有理的集合。定义一个合法的操作符族是用户的责任。
进一步的信息请参考Section 38.15。
name
一个现有操作符族的名称(可以是模式限定的)。
index_method
这个操作符族所应用的索引方法的名称。
strategy_number
与该操作符族相关的一个操作符的索引方法策略号。
operator_name
与该操作符族相关的一个操作符的名称(可以是模式限定的)。
op_type
在一个OPERATOR
子句中指定该操作符的操作数数据类型,
或者用NONE
来表示一个左一元或者右一元操作符。不同于
CREATE OPERATOR CLASS
中类似的语法,操作数数据
类型总是必须被指定。
在一个ADD FUNCTION
子句中指定该函数意图支持的操作数
数据类型(如果不同于该函数的输入数据类型)。对于 B-树比较函数和哈希
函数,有必要指定op_type
,因为该函数的输入数据类型
总是正确的。对于 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
语句。