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 樹排序支援函式旨在支援跨資料類型比較的情況之外,op_type
無需在 FUNCTION
子句中指定。
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
語法。
如果您在文件中發現任何不正確、與您特定功能的使用經驗不符或需要進一步澄清的地方,請使用此表格來回報文件問題。