ALTER OPERATOR FAMILY — 更改操作符族定义
ALTER OPERATOR FAMILYnameUSINGindex_methodADD { OPERATORstrategy_numberoperator_name(op_type,op_type) [ FOR SEARCH | FOR ORDER BYsort_family_name] | FUNCTIONsupport_number[ (op_type[ ,op_type] ) ]function_name[ (argument_type[, ...] ) ] } [, ... ] ALTER OPERATOR FAMILYnameUSINGindex_methodDROP { OPERATORstrategy_number(op_type[ ,op_type] ) | FUNCTIONsupport_number(op_type[ ,op_type] ) } [, ... ] ALTER OPERATOR FAMILYnameUSINGindex_methodRENAME TOnew_nameALTER OPERATOR FAMILYnameUSINGindex_methodOWNER TO {new_owner| CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER OPERATOR FAMILYnameUSINGindex_methodSET SCHEMAnew_schema
ALTER OPERATOR FAMILY 更改操作符族(operator family)的定义。您可以向族中添加操作符和支持函数,或者从族中移除它们,也可以更改族名或所有者。
当使用 ALTER OPERATOR FAMILY 向族中添加操作符和支持函数时,它们不属于族中的任何特定操作符类(operator class),而只是“松散地”包含在族中。这表明这些操作符和函数与族的概念兼容,但对于任何特定索引的正确功能并非必需。(如果有此类必需的操作符和函数,则应将其声明为操作符类的一部分;参见 CREATE OPERATOR CLASS。)PostgreSQL 允许随时从族中删除松散成员,但操作符类的成员在删除整个类及其依赖的任何索引之前不能被删除。通常,单数据类型的操作符和函数是操作符类的一部分,因为它们是支持该特定数据类型的索引所必需的,而跨数据类型的操作符和函数则被声明为族中的松散成员。
您必须是超级用户才能使用 ALTER OPERATOR FAMILY。(此限制是因为错误的操作符族定义可能会混淆甚至导致服务器崩溃。)
ALTER OPERATOR FAMILY 目前不会检查操作符族定义是否包含索引方法所需的所有操作符和函数,也不会检查操作符和函数是否构成一个自洽的集合。用户有责任定义一个有效操作符族。
有关更多信息,请参阅第 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 语句。