PostgreSQL CREATE OPERATOR CLASS

2021-09-09 11:34 更新

CREATE OPERATOR CLASS — 定義一個新的操作符類

大綱

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 ) ] [ FOR SEARCH | FOR ORDER BY sort_family_name ]   | FUNCTION support_number [ ( op_type [ , op_type ] ) ] function_name ( argument_type [, ...] )   | STORAGE storage_type  } [, ... ]

描述

CREATE OPERATOR CLASS創(chuàng)建新的操作符類。 一個操作符類定義一種特殊的數(shù)據(jù)類型如何被用于一個索引。操作符類指定為 該數(shù)據(jù)類型和索引方法扮演特殊角色或者策略的操作符。操作符 類還指定當(dāng)該操作符類被選擇用于一個索引列時,索引方法要使用的支持函數(shù)。 操作符類所使用的所有操作符和函數(shù)必須在操作符類被創(chuàng)建之前被定義好。

如果給出了一個模式名稱,那么該操作符類會被創(chuàng)建在指定模式中。否則,它 會被創(chuàng)建在當(dāng)前模式中。同一模式中的兩個操作符類只有在被用于不同的索引 方法時才可以具有相同的名稱。

定義操作符類的用戶將成為其擁有者。當(dāng)前,創(chuàng)建用戶必須是超級用戶(做出 這種限制是因為錯誤的操作符類定義會讓服務(wù)器混淆甚至崩潰)。

CREATE OPERATOR CLASS當(dāng)前不會檢查操作符 類定義是否包括該索引方法所要求的所有操作符和函數(shù),也不會檢查這些操作符 和函數(shù)是否構(gòu)成一個一致的集合。定義一個合法的操作符類是用戶的責(zé)任。

相關(guān)的操作符類可以被組成操作符族。要把一個新的操作符類 加入到一個現(xiàn)有的族中,可以在CREATE OPERATOR CLASS中指定FAMILY選項。如果沒有這個選項, 新的類會被放到一個同名的族中(如果族不存在會創(chuàng)建之)。

進(jìn)一步的信息可參考第 37.16 節(jié)。

參數(shù)

name

要創(chuàng)建的操作符類的名稱。該名稱可以被模式限定。

DEFAULT

如果存在,該操作符類將成為其數(shù)據(jù)類型的默認(rèn)操作符類。對一種 特定的數(shù)據(jù)類型和索引方法至多有一個默認(rèn)操作符類。

data_type

這個操作符類所用于的列數(shù)據(jù)類型。

index_method

這個操作符類所用于的索引方法的名稱。

family_name

要把這個操作符類加入其中的已有操作符族的名稱。如果沒有指定, 將使用一個同名操作符族(如果還不存在則創(chuàng)建之)。

strategy_number

用于一個與該操作符類相關(guān)聯(lián)的操作符的索引方法策略號。

operator_name

一個與該操作符類相關(guān)聯(lián)的操作符的名稱(可以被模式限定)。

op_type

在一個OPERATOR子句中,這表示該操作符的操作數(shù)數(shù)據(jù) 類型,或者用NONE來表示一個左一元或者右一元操作符。 在操作數(shù)數(shù)據(jù)類型與該操作符的數(shù)據(jù)類型相同的一般情況下,操作數(shù)的 數(shù)據(jù)類型可以被省略。

在一個FUNCTION子句中,這表示該函數(shù)要支持的操作數(shù) 數(shù)據(jù)類型,如果它與該函數(shù)的輸入數(shù)據(jù)類型(對于 B-樹比較函數(shù)和哈希 函數(shù))或者操作符類的數(shù)據(jù)類型(對于 B-樹排序支持函數(shù)和與B-樹相同的的圖像函數(shù)以及所有GiST、 SP-GiST、GIN 和 BRIN 操作符類中的函數(shù))不同。這些默認(rèn)值是正確的,并且 op_type因此不必 在FUNCTION子句中被指定,對于 B-樹排序支持函數(shù)的情 況來說,這表示跨數(shù)據(jù)類型比較。

sort_family_name

一個現(xiàn)有btree操作符族的名稱(可以是模式限定的), 它描述與一種排序操作符相關(guān)聯(lián)的排序順序。

如果FOR SEARCHFOR ORDER BY都沒有被 指定,那么FOR SEARCH是默認(rèn)值。

support_number

用于一個與該操作符類相關(guān)聯(lián)的函數(shù)的索引方法支持函數(shù)編號。

function_name

一個用于該操作符類的索引方法支持函數(shù)的函數(shù)名稱(可以是 模式限定的)。

argument_type

該函數(shù)的參數(shù)數(shù)據(jù)類型。

storage_type

實際存儲在索引中的數(shù)據(jù)類型。通常這和列數(shù)據(jù)類型相同,但是有些 索引方法(當(dāng)前有 GiST、GIN 和 BRIN)允許它們不同。 除非索引方法允許使用不同的類型,STORAGE子句必須 被省略。 如果data_type列被指定為anyarray, 那么storage_type可以被聲明為 anyelement以指示索引條目是屬于為每個特定索引創(chuàng)建的實際數(shù)組類型的元素類型的成員。

OPERATORFUNCTIONSTORAGE 子句可以以任何順序出現(xiàn)。

注解

因為索引機制在使用函數(shù)之前不檢查它們的權(quán)限,將一個函數(shù)或者操作符包括在 一個操作符類中相當(dāng)于在其上授予公共執(zhí)行權(quán)限。這對操作符類中很有用的函數(shù) 來說通常不成問題。

操作符不應(yīng)該用 SQL 函數(shù)定義。SQL 函數(shù)很有可能會被內(nèi)聯(lián)到調(diào)用查詢中,這 會妨礙優(yōu)化器識別該查詢匹配一個索引。

PostgreSQL 8.4 之前, OPERATOR子句可以包括一個RECHECK選項。現(xiàn)在 已經(jīng)不再支持,因為一個索引操作符是否為有損的現(xiàn)在是在運行 時實時決定的。這允許在一個操作符可能是或者可能不是有損的情況下有效地處理。

示例

下面的例子為數(shù)據(jù)類型_int4int4數(shù)組) 定義了一個 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 標(biāo)準(zhǔn)中沒有 CREATE OPERATOR CLASS語句。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號