CREATE OPERATOR CLASS — 定義新的運算子類別
CREATE OPERATOR CLASSname
[ DEFAULT ] FOR TYPEdata_type
USINGindex_method
[ FAMILYfamily_name
] AS { 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
[, ...] ) | STORAGEstorage_type
} [, ... ]
CREATE OPERATOR CLASS
建立一個新的運算子類別。運算子類別定義了特定資料類型如何與索引一起使用。運算子類別指定某些運算子將填充此資料類型和此索引方法的特定角色或「策略」。運算子類別也指定索引方法在為索引欄位選擇運算子類別時使用的支援函數。運算子類別使用的所有運算子和函數都必須在建立運算子類別之前定義。
如果給定了綱要名稱,則運算子類別將在指定的綱要中建立。否則,它將在目前的綱要中建立。只有當同一綱要中的兩個運算子類別用於不同的索引方法時,它們才能具有相同的名稱。
定義運算子類別的使用者將成為其擁有者。目前,建立使用者必須是超級使用者。(做出此限制是因為錯誤的運算子類別定義可能會混淆甚至崩潰伺服器。)
CREATE OPERATOR CLASS
目前不會檢查運算子類別定義是否包含索引方法所需的所有運算子和函數,也不會檢查運算子和函數是否形成自洽的集合。使用者有責任定義有效的運算子類別。
相關的運算子類別可以分組到運算子族中。要將新的運算子類別新增到現有的族中,請在 CREATE OPERATOR CLASS
中指定 FAMILY
選項。如果沒有此選項,則新的類別將被放置在與新類別同名的族中(如果該族不存在,則建立該族)。
請參閱第 36.16 節以取得更多資訊。
name
要建立的運算子類別的名稱。該名稱可以是綱要限定的。
DEFAULT
如果存在,則運算子類別將成為其資料類型的預設運算子類別。對於特定的資料類型和索引方法,最多可以有一個運算子類別是預設值。
data_type
此運算子類別所針對的欄位資料類型。
index_method
此運算子類別所針對的索引方法的名稱。
family_name
要將此運算子類別新增到的現有運算子族的名稱。如果未指定,則使用與運算子類別同名的族(如果該族不存在,則建立該族)。
strategy_number
與運算子類別相關聯的運算子的索引方法的策略編號。
operator_name
與運算子類別相關聯的運算子的名稱(可選擇綱要限定)。
op_type
在 OPERATOR
子句中,運算子的運算元資料類型,或 NONE
表示前置運算子。在它們與運算子類別的資料類型相同的一般情況下,運算元資料類型可以省略。
在 FUNCTION
子句中,如果與函數的輸入資料類型(對於 B 樹比較函數和雜湊函數)或類別的資料類型(對於 B 樹排序支援函數、B 樹相等映像函數以及 GiST、SP-GiST、GIN 和 BRIN 運算子類別中的所有函數)不同,則函數旨在支援的運算元資料類型。這些預設值是正確的,因此除了旨在支援跨資料類型比較的 B 樹排序支援函數的情況外,不需要在 FUNCTION
子句中指定 op_type
。
sort_family_name
現有的 btree
運算子族的名稱(可選擇綱要限定),該族描述與排序運算子相關聯的排序。
如果未指定 FOR SEARCH
或 FOR ORDER BY
,則預設為 FOR SEARCH
。
support_number
與運算子類別相關聯的函數的索引方法支援函數編號。
function_name
函數的名稱(可選擇綱要限定),該函數是運算子類別的索引方法支援函數。
argument_type
函數的參數資料類型。
storage_type
索引中實際儲存的資料類型。通常這與欄位的資料類型相同,但某些索引方法(目前為 GiST、GIN、SP-GiST 和 BRIN)允許其不同。STORAGE
子句必須省略,除非索引方法允許使用不同的類型。如果欄位 data_type
指定為 anyarray
,則 storage_type
可以宣告為 anyelement
,表示索引項目是屬於每個特定索引所建立的實際陣列類型之元素類型的成員。
OPERATOR
、FUNCTION
和 STORAGE
子句可以以任何順序出現。
由於索引機制在使用函數之前不會檢查函數的存取權限,因此在運算子類別中包含函數或運算子等同於授予對其公開執行權限。對於在運算子類別中有用的函數種類來說,這通常不是問題。
運算子不應由 SQL 函數定義。SQL 函數很可能會被內聯到呼叫查詢中,這將阻止最佳化器識別查詢是否與索引匹配。
在 PostgreSQL 8.4 之前,OPERATOR
子句可以包含 RECHECK
選項。這不再支援,因為索引運算子是否為「有損」現在是在執行時動態決定的。這允許有效處理運算子可能是有損或無損的情況。
以下範例指令定義了資料類型 _int4
(int4
的陣列)的 GiST 索引運算子類別。請參閱 intarray 模組以取得完整範例。
CREATE OPERATOR CLASS gist__int_ops DEFAULT FOR TYPE _int4 USING gist AS OPERATOR 3 &&, OPERATOR 6 = (anyarray, anyarray), OPERATOR 7 @>, OPERATOR 8 <@, OPERATOR 20 @@ (_int4, query_int), FUNCTION 1 g_int_consistent (internal, _int4, smallint, oid, internal), FUNCTION 2 g_int_union (internal, internal), FUNCTION 3 g_int_compress (internal), FUNCTION 4 g_int_decompress (internal), FUNCTION 5 g_int_penalty (internal, internal, internal), FUNCTION 6 g_int_picksplit (internal, internal), FUNCTION 7 g_int_same (_int4, _int4, internal);
CREATE OPERATOR CLASS
是 PostgreSQL 的延伸功能。SQL 標準中沒有 CREATE OPERATOR CLASS
陳述式。
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步說明的內容,請使用此表單回報文件問題。