2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3

CREATE OPERATOR CLASS

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 用於建立一個新的運算子類。運算子類定義了特定資料型別如何與索引一起使用。運算子類指定某些運算子將在此資料型別和此索引方法中扮演特定角色或 策略。當運算子類被選用於索引列時,運算子類還指定了索引方法將使用的支援函式。運算子類使用的所有運算子和函式必須在建立運算子類之前定義好。

如果給出了模式名,則運算子類將在指定的模式中建立。否則,它將在當前模式中建立。同一模式下的兩個運算子類可以擁有相同的名稱,前提是它們是為不同的索引方法設計的。

定義運算子類的使用者將成為其所有者。目前,建立使用者必須是超級使用者。(此限制是由於錯誤的 the operator class 定義可能會混淆甚至導致伺服器崩潰。)

CREATE OPERATOR CLASS 目前不會檢查運算子類定義是否包含索引方法所需的所有運算子和函式,也不會檢查運算子和函式是否構成一個自洽的集合。使用者有責任定義一個有效運算子類。

相關的運算子類可以分組到 運算子族 中。要將新的運算子類新增到現有族中,請在 CREATE OPERATOR CLASS 中指定 FAMILY 選項。如果不指定此選項,則新類將被放入一個與新類同名的族中(如果該族尚不存在,則會建立它)。

有關更多資訊,請參閱第 36.16 節

引數

name

要建立的運算子類的名稱。名稱可以帶有模式限定。

DEFAULT

如果存在,則該運算子類將成為其資料型別的預設運算子類。對於特定的資料型別和索引方法,最多隻能有一個運算子類是預設的。

data_type

此運算子類所針對的列資料型別。

index_method

此運算子類所針對的索引方法的名稱。

family_name

要將此運算子類新增到的現有 btree 運算子族的名稱。如果未指定,則使用與運算子類同名的族(如果尚不存在,則建立它)。

strategy_number

索引方法中與運算子類關聯的運算子的策略編號。

operator_name

與運算子類關聯的運算子的名稱(可選擇帶模式限定)。

op_type

OPERATOR 子句中,運算子的運算元資料型別,或 NONE 以表示字首運算子。在運算元與運算子類的類資料型別相同的一般情況下,可以省略運算元資料型別。

FUNCTION 子句中,函式旨在支援的運算元資料型別(如果與函式的輸入資料型別不同(對於 B-tree 比較函式和雜湊函式)或與類的類資料型別不同(對於 B-tree 排序支援函式、B-tree 相等映象函式以及 GiST、SP-GiST、GIN 和 BRIN 運算子類中的所有函式))。這些預設值是正確的,因此 op_typeFUNCTION 子句中不必指定,除非是用於支援跨資料型別比較的 B-tree 排序支援函式。

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,以指示索引條目是每個特定索引所建立的實際陣列型別的元素型別的成員。

OPERATORFUNCTIONSTORAGE 子句可以按任何順序出現。

註釋

由於索引機制在使用函式之前不檢查其訪問許可權,因此將函式或運算子包含在運算子類中等同於授予其公共執行許可權。對於在運算子類中有用的函式型別,這通常不是問題。

運算子不應由 SQL 函式定義。SQL 函式很可能會被內聯到呼叫查詢中,這將阻止最佳化器識別查詢與索引匹配。

示例

下面的示例命令為 _int4int4 的陣列)資料型別定義了一個 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 CLASSPostgreSQL 的擴充套件。SQL 標準中沒有 CREATE OPERATOR CLASS 語句。

提交更正

如果您在文件中發現任何不正確、與您對特定功能的實際使用經驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。