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_ROLE | 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
目前不會檢查運算子族定義是否包含索引方法所需的所有運算子和函數,也不會檢查運算子和函數是否形成一個自洽的集合。使用者有責任定義有效的運算子族。
請參閱 第 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 函式很可能會內嵌到呼叫查詢中,這將阻止最佳化器識別查詢與索引匹配。
在 PostgreSQL 8.4 之前,OPERATOR
子句可以包含 RECHECK
選項。這不再被支援,因為索引運算子是否為“有損耗的(lossy)”現在是在執行時動態確定的。這允許有效處理運算子可能是有損耗的也可能不是有損耗的情況。
以下範例命令將跨資料類型運算子和支援函式新增到一個已經包含 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
語句。
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用此表格來回報文件問題。