?
本文檔使用
php中文網(wǎng)手冊 發(fā)布
CREATE OPERATOR CLASS name [ DEFAULT ] FOR TYPE data_type USING index_method [ FAMILY family_name ] AS { OPERATOR strategy_number operator_name [ ( op_type, op_type ) ] | FUNCTION support_number [ ( op_type [ , op_type ] ) ] function_name ( argument_type [, ...] ) | STORAGE storage_type } [, ... ]
CREATE OPERATOR CLASS定義一個(gè)新的操作符類。 一個(gè)操作符類定義一種特定的數(shù)據(jù)類型如何與一種索引一起使用。 操作符類聲明特定的操作符可以為這種數(shù)據(jù)類型以及這種索引方法填 充特定的角色或者"策略"。操作符類還聲明索引方法在為一個(gè)索引字段 選定該操作符類的時(shí)候要使用的支持過程。所有操作符類使用的函數(shù)和 操作符都必須在創(chuàng)建操作符類之前定義。
如果給出了模式名字,那么操作符類就在指定的模式中創(chuàng)建。否則就在 當(dāng)前模式中創(chuàng)建。在同一個(gè)模式中的兩個(gè)操作符類可以有同樣的名字, 但它們必須用于不同的索引方法。
定義操作符類的用戶將成為其所有者。目前,創(chuàng)造者必須是超級用戶。 作這樣的限制是因?yàn)橐粋€(gè)有問題的操作符類定義會讓服務(wù)器困惑,甚至崩潰。
CREATE OPERATOR CLASS既不檢查這個(gè)類定義是否 包含所有索引方法需要的操作符以及函數(shù),也不檢查這些操作符和函數(shù) 是否形成一個(gè)自包含的集合。定義一個(gè)合法的操作符類是用戶的責(zé)任。
相關(guān)的操作符類可以被劃歸到operator families中。 為了添加一個(gè)新的操作符類到一個(gè)已有族類中,要在 CREATE OPERATOR CLASS中聲明FAMILY選項(xiàng)。 沒有該選項(xiàng),新的類被放入與新類同名的族類中(若不存在則創(chuàng)建該族類)。
參考Section 35.14獲取更多信息。
將要創(chuàng)建的操作符類的名字(可以用模式修飾)。
表示該操作符類將成為它的數(shù)據(jù)類型的缺省操作符類。對于某個(gè) 數(shù)據(jù)類型和訪問方式而言,最多有一個(gè)操作符類是缺省的。
這個(gè)操作符類處理的字段的數(shù)據(jù)類型。
這個(gè)操作符類處理的索引方法的名字。
添加操作符類的已有操作符系列的名稱。若未聲明,會使用與操作符類同名的系列 (若不存在,則創(chuàng)建它)。
一個(gè)操作符和這個(gè)操作符類關(guān)聯(lián)的索引方法的策略數(shù)。
一個(gè)和該操作符類關(guān)聯(lián)的操作符的名字(可以用模式修飾)。
在OPERATOR條款里,一個(gè)操作符的輸入數(shù)據(jù)類型, 或者是NONE表示左目或者右目操作符。通常情況下 可以省略輸入數(shù)據(jù)類型,因?yàn)檫@個(gè)時(shí)候它們和操作符類的數(shù)據(jù)類型相同。
在FUNCTION子句中,函數(shù)打算支持的操作數(shù)據(jù)類型,若不同于函數(shù) (對于B-tree和hash索引)的輸入數(shù)據(jù)類型或者類的數(shù)據(jù)類型(對于GIN和GiST索引)。 這些默認(rèn)值總是正確,因此,在CREATE OPERATOR CLASS中聲明一個(gè) FUNCTION子句中的op_type 是沒有意義的,但提供該選項(xiàng)是為了與ALTER OPERATOR FAMILY中的 可比較語法保持一致。
索引方法對一個(gè)與操作符類關(guān)聯(lián)的函數(shù)的支持過程數(shù)。
一個(gè)函數(shù)的名字(可以有模式修飾),這個(gè)函數(shù)是索引方法對此操作符類的支持 過程。
函數(shù)參數(shù)的數(shù)據(jù)類型。
實(shí)際存儲在索引里的數(shù)據(jù)類型。通常它和字段數(shù)據(jù)類型相同,但是一些索引 方法(目前GIN和GiST)允許它是不同的。除非索引方法允許使用一種不同的類型, 否則必須省略STORAGE子句。
OPERATOR,FUNCTION,STORAGE子句可以 按照任意順序出現(xiàn)。
因?yàn)樗饕龣C(jī)制不在使用函數(shù)前檢查其訪問機(jī)制,在操作符類中包含操作符或者 函數(shù)等價(jià)于授權(quán)給所有人執(zhí)行權(quán)限。這對于那些用于操作符類的函數(shù)通常不會 導(dǎo)致什么問題。
操作符不應(yīng)該用SQL函數(shù)定義。一個(gè)SQL函數(shù)很可能是內(nèi)聯(lián)到調(diào)用它的查詢里面, 這樣將阻止優(yōu)化器識別這個(gè)查詢是否可以使用索引。
在PostgreSQL8.4之前,OPERATOR子句 可包括RECHECK選項(xiàng)。這不再支持,運(yùn)維索引操作符是否是 "lossy"現(xiàn)在都是在運(yùn)行時(shí)動態(tài)決定的。這允許操作符可能或者不可能被損耗的 cases的高效處理。
下面的例子命令為數(shù)據(jù)類型_int4(_int4數(shù)組) 定義了一個(gè)GiST索引操作符類。參閱contrib/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, int, 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是一個(gè) PostgreSQL擴(kuò)展。在SQL標(biāo)準(zhǔn)中沒有 CREATE OPERATOR CLASS這個(gè)語句。