Man page - create_type(7)

Manual

CREATE TYPE

NAME
SYNOPSIS
DESCRIPTION 描 述
COMPOSITE TYPES 複 合 型 別
BASE TYPES 基 本 型 別
ARRAY TYPES 陣 列 型 別
PARAMETERS 引 數
NOTES 注 意
EXAMPLES 例 子
COMPATIBILITY 相 容 性
SEE ALSO 參 見
譯 者


NAME

CREATE TYPE - 定 義 一 個 新 的 資 料 型 別

SYNOPSIS

CREATE TYPE name AS
( attribute_name data_type [, ... ] )

CREATE TYPE name (
INPUT = input_function ,
OUTPUT = output_function
[ , RECEIVE = receive_function ]
[ , SEND = send_function ]
[ , INTERNALLENGTH = { internallength | VARIABLE } ]
[ , PASSEDBYVALUE ]
[ , ALIGNMENT = alignment ]
[ , STORAGE = storage ]
[ , DEFAULT = default ]
[ , ELEMENT = element ]
[ , DELIMITER = delimiter ]
)

DESCRIPTION 描 述

CREATE TYPE 為 當 前 資 料 庫 註 冊 一 個 新 的 資 料 型 別 。 定 義 該 型 別 的 使 用 者 成 為 其 所 有 者 。

如 果 給 出 模 式 名 , 那 麼 該 型 別 是 在 指 定 模 式 中 建 立 。 否 則 它 是 在 當 前 模 式 中 建 立 。 型 別 名 必 需 和 同 一 模 式 中 任 何 現 有 的 型 別 或 者 域 不 同 。 ( 因 為 表 和 資 料 型 別 有 聯 絡 , 型 別 名 不 能 和 同 模 式 中 的 表 名 字 衝 突 。 )

COMPOSITE TYPES 複 合 型 別

第 一 種 形 式 的 CREATE TYPE 建 立 一 個 複 合 型 別 。 複 合 型 別 是 透 過 一 列 屬 性 名 和 資 料 型 別 宣 告 的 。 這 樣 實 際 上 和 一 個 表 的 行 型 別 一 樣 , 但 是 如 果 我 們 只 是 想 定 義 一 個 型 別 , 那 麼 使 用 CREATE TYPE 避 免 了 直 接 建 立 實 際 的 表 。 一 個 獨 立 的 複 合 型 別 對 於 一 個 函 式 的 返 回 型 別 非 常 有 用 。

BASE TYPES 基 本 型 別

第 二 種 形 式 的 CREATE TYPE建 立 一 種 新 的 基 本 型 別 ( 標 量 型 別 ) 。 引 數 可 以 以 任 意 的 順 序 出 現 , 而 不 是 上 面 顯 示 的 那 樣 。 並 且 大 多 數 都 是 可 選 的 。 它 要 求 要 在 定 義 型 別 之 前 先 註 冊 兩 個 函 式 ( 用 CREATE FUNCTION命 令 ) 。 支 援 函 式 input_function 和 output_function 是 必 須 的 , 而 函 式 receive_function 和 send_function 是 可 選 的 。 通 常 , 這 些 函 式 必 須 用 C 或 者 其 它 低 層 語 言 編 寫 。

函 式 input_function 將 該 型 別 的 外 部 文 字 形 式 轉 換 成 可 以 被 對 該 型 別 操 作 的 運 算 子 和 函 式 識 別 的 內 部 形 式 。 output_function 用 做 相 反 用 途 。 輸 入 函 式 可 以 宣 告 為 接 受 一 個 型 別 為 c_string 的 引 數 , 或 者 接 受 三 個 型 別 分 別 為 c_string, oid, integer 的 引 數 。 ( 第 一 個 引 數 是 C 字 串 形 式 的 輸 入 文 字 , 第 二 個 是 在 該 型 別 為 陣 列 型 別 時 其 元 素 的 型 別 , 第 三 個 是 目 標 欄 位 的 typmod, 如 果 已 知 的 話 。 ) 它 應 該 返 回 一 個 該 資 料 型 別 本 身 的 數 值 。 輸 出 函 式 可 以 宣 告 為 接 受 一 個 型 別 為 新 資 料 型 別 的 引 數 , 或 者 接 受 兩 個 型 別 , 第 二 個 引 數 的 型 別 是 oid。 第 二 個 引 數 也 是 用 於 陣 列 型 別 的 陣 列 元 素 型 別 。 輸 出 函 式 應 該 返 回 型 別 cstring。

可 選 的 receive_function 把 該 型 別 的 外 部 二 進 位 制 表 現 形 式 轉 換 成 內 部 表 現 形 式 。 如 果 沒 有 提 供 這 個 函 式 , 那 麼 該 型 別 不 能 用 二 進 位 制 輸 入 。 二 進 位 制 格 式 應 該 選 取 那 種 轉 換 成 內 部 格 式 比 較 容 易 的 , 同 時 還 有 一 定 移 植 性 的 。 ( 比 如 , 標 準 的 整 數 資 料 型 別 使 用 網 路 位 元 組 序 作 為 外 部 的 二 進 位 制 表 現 形 式 , 而 內 部 表 現 形 式 是 機 器 的 本 機 位 元 組 序 。 ) 接 收 函 式 應 該 宣 告 為 接 受 一 個 型 別 為 internal 的 引 數 , 或 者 兩 個 型 別 分 別 為 internal 和 oid 的 引 數 。 它 必 須 返 回 一 個 數 據 型 別 自 身 的 數 值 。 ( 第 一 個 引 數 是 一 個 指 向 一 個 StringInfo 緩 衝 區 的 , 儲 存 接 受 位 元 組 串 的 指 標 ; 可 選 的 第 二 個 引 數 是 元 素 型 別 ——如 果 型 別 是 一 個 數 組 型 別 的 話 。 ) 類 似 的 , 可 選 的 send_function 把 型 別 轉 換 為 外 部 二 進 位 制 表 現 形 式 。 如 果 沒 有 提 供 這 些 函 式 , 那 麼 型 別 就 不 能 用 二 進 位 制 方 式 輸 出 。 傳 送 函 式 可 以 宣 告 為 接 收 一 個 新 資 料 型 別 , 或 者 接 收 兩 個 引 數 , 第 二 個 引 數 的 型 別 是 oid。 第 二 個 引 數 仍 然 是 用 做 陣 列 型 別 的 。 傳 送 函 式 必 須 返 回 bytea。

這 個 時 候 你 應 該 覺 得 奇 怪 , 就 是 輸 入 和 輸 出 函 式 怎 麼 可 以 宣 告 為 返 回 新 型 別 的 結 果 或 者 是 接 受 新 型 別 的 引 數 , 而 且 是 在 新 型 別 建 立 之 前 就 需 要 建 立 它 們 。 答 案 是 輸 入 函 式 必 須 先 建 立 , 然 後 是 輸 出 函 式 , 最 後 是 資 料 型 別 。 PostgreSQL 將 首 先 把 新 資 料 型 別 的 名 字 看 作 輸 入 函 式 的 返 回 型 別 。 它 將 建 立 一 個 "殼 "型 別 , 這 個 型 別 只 是 在 pg_type裡 面 的 一 個 佔 位 符 , 然 後 把 輸 入 函 式 定 義 和 這 個 殼 型 別 連 線 起 來 。 類 似 的 是 輸 出 函 式 將 連 線 到 ( 現 在 已 經 存 在 ) 的 殼 型 別 。 最 後 , CREATE TYPE 把 這 個 殼 型 別 替 換 成 完 整 的 型 別 定 義 , 這 樣 就 可 以 使 用 新 型 別 了 。

儘 管 新 型 別 的 內 部 表 現 形 式 只 有 I/O 函 式 和 其 它 你 建 立 來 使 用 該 型 別 的 函 數 了 解 , 但 內 部 表 現 還 是 有 幾 個 屬 性 必 須 為 PostgreSQL 宣 告 。 這 些 中 最 重 要 的 是 internallength。 基 本 資 料 型 別 可 定 義 成 為 定 長 , 這 時 internallength 是 一 個 正 整 數 , 也 可 以 是 變 長 的 , 透 過 把 internallength 設 定 為 VARIABLE 表 示 。 ( 在 內 部 , 這 個 狀 態 是 透 過 將 typlen設 定 為 -1 實 現 的 。 ) 所 有 變 長 型 別 的 內 部 形 式 都 必 須 以 一 個 四 位 元 組 整 數 開 頭 , 這 個 整 數 給 出 此 型 別 這 個 數 值 的 全 長 。

可 選 的 標 記 PASSEDBYVALUE 表 明 該 型 別 的 數 值 是 用 值 傳 遞 的 , 而 不 是 用 引 用 。 你 不 能 傳 遞 那 些 內 部 形 式 大 於 Datum ( 大 多 數 機 器 上 是 4 位 元 組 , 有 些 是 8 位 元 組 ) 型 別 的 尺 寸 的 資 料 型 別 的 值 。

alignment 引 數 宣 告 該 資 料 型 別 要 求 的 對 齊 儲 存 方 式 。 允 許 的 數 值 等 效 於 按 照 1, 2, 4, 或 者 8 位 元 組 邊 界 對 齊 。 請 注 意 變 長 型 別 必 須 有 至 少 4 位 元 組 的 對 齊 , 因 為 它 們 必 須 包 含 一 個 int4 作 為 它 們 的 第 一 個 成 份 。

storage 引 數 允 許 為 變 長 資 料 型 別 選 擇 儲 存 策 略 。 ( 定 長 型 別 只 允 許 使 用 plain) 。 plain 宣 告 該 資 料 型 別 總 是 用 內 聯 的 方 式 而 不 是 壓 縮 的 方 式 儲 存 。 extended 宣 告 系 統 將 首 先 試 圖 壓 縮 一 個 長 的 資 料 值 , 然 後 如 果 它 仍 然 太 長 的 話 就 將 它 的 值 移 出 主 表 的 行 , 但 系 統 將 不 會 壓 縮 它 。 main 允 許 壓 縮 , 但 是 不 贊 成 把 數 值 移 動 出 主 表 。 ( 用 這 種 儲 存 策 略 的 資 料 項 可 能 仍 將 移 動 出 主 表 , 如 果 不 能 放 在 一 行 裡 的 話 , 但 是 它 們 將 比 extended 和 external 項 更 願 意 呆 在 主 表 裡 。 )

如 果 使 用 者 希 望 欄 位 的 資 料 型 別 預 設 時 不 是 NULL, 而 是 其 它 什 麼 東 西 , 那 麼 你 可 以 宣 告 一 個 預 設 值 。 在 DEFAULT 關 鍵 字 裡 面 宣 告 預 設 值 。 ( 這 樣 的 預 設 可 以 被 附 著 在 特 定 欄 位 上 的 明 確 的 DEFAULT 子 句 覆 蓋 。 )

要 表 示 一 個 型 別 是 陣 列 , 用 ELEMENT 關 鍵 字 宣 告 陣 列 元 素 的 型 別 。 比 如 , 要 定 義 一 個 4 位 元 組 整 數 (int4)的 陣 列 , 宣 告

ELEMENT = int4

。 有 關 陣 列 型 別 的 更 多 細 節 在 下 面 描 述 。

要 宣 告 用 於 這 種 型 別 陣 列 的 外 部 形 式 的 數 值 之 間 的 分 隔 符 , 可 用 delimiter 宣 告 指 定 分 隔 符 。 預 設 的 分 隔 符 是 逗 號 ( ,) 。 請 注 意 分 隔 符 是 和 陣 列 元 素 型 別 相 關 聯 , 而 不 是 陣 列 型 別 本 身 。

ARRAY TYPES 陣 列 型 別

在 建 立 使 用 者 定 義 資 料 型 別 的 時 候 , PostgreSQL 自 動 建 立 一 個 與 之 關 聯 的 陣 列 型 別 , 其 名 字 由 該 基 本 型 別 的 名 字 字 首 一 個 下 劃 線 組 成 。 分 析 器 理 解 這 個 命 名 傳 統 , 並 且 把 對 型 別 為 foo[] 的 欄 位 的 請 求 轉 換 成 對 型 別 為 _foo 的 欄 位 的 請 求 。 這 個 隱 含 建 立 的 陣 列 型 別 是 變 長 並 且 使 用 內 建 的 輸 入 和 輸 出 函 式 array_in 和 array_out。

你 很 可 能 會 問 如 果 系 統 自 動 製 作 正 確 的 陣 列 型 別 , 那 為 什 麼 有 個 ELEMENT選 項 ? 使 用 ELEMENT 有 用 的 唯 一 的 場 合 是 在 你 製 作 的 定 長 型 別 碰 巧 在 內 部 是 一 個 一 定 數 目 相 同 事 物 的 陣 列 , 而 你 又 想 允 許 這 N 個 事 物 可 以 透 過 腳 標 直 接 關 聯 , 以 及 那 些 你 準 備 把 該 型 別 當 做 整 體 進 行 的 操 作 。 比 如 , 型 別 name 就 允 許 其 構 成 char 用 這 種 方 法 關 聯 。 一 個 二 維 的 point 型 別 也 可 以 允 許 其 兩 個 構 成 浮 點 型 按 照 類 似 point[0] 和 point[1] 的 方 法 關 聯 。 請 注 意 這 個 功 能 只 適 用 與 那 些 內 部 形 式 是 一 個 相 同 的 定 長 域 的 序 列 的 型 別 。 一 個 可 以 腳 標 化 的 變 長 型 別 必 須 有 被 array_in 和 array_out 使 用 的 一 般 化 的 內 部 表 現 形 式 。 出 於 歷 史 原 因 ( 也 就 是 說 , 那 些 明 顯 錯 誤 但 補 救 來 得 太 遲 的 問 題 ) , 定 長 陣 列 型 別 的 腳 標 從 零 開 始 , 而 不 是 象 變 長 型 別 那 樣 的 從 一 開 始 。

PARAMETERS 引 數

name

將 要 建 立 的 型 別 名 ( 可 以 有 模 式 修 飾 ) 。

attribute_name

複 合 型 別 的 一 個 屬 性 ( 欄 位 ) 的 名 字 。

data_type

一 個 要 成 為 一 個 複 合 型 別 的 欄 位 的 現 有 資 料 型 別 的 名 字 。

input_function

一 個 函 式 的 名 稱 , 將 資 料 從 外 部 型 別 轉 換 成 內 部 型 別 。

output_function

一 個 函 式 的 名 稱 , 將 資 料 從 內 部 格 式 轉 換 成 適 於 顯 示 的 形 式 。

receive_function

把 資 料 從 型 別 的 外 部 二 進 位 制 形 式 轉 換 成 其 內 部 形 式 的 函 式 的 名 字 。

send_function

把 資 料 從 型 別 的 內 部 形 式 轉 換 成 其 外 部 二 進 位 制 形 式 的 函 式 名 。

internallength

一 個 數 值 常 量 , 說 明 新 型 別 的 內 部 表 現 形 式 的 長 度 。 預 設 的 假 設 是 它 是 變 長 的 。

alignment

該 資 料 型 別 的 儲 存 對 齊 要 求 。 如 果 聲 明 瞭 , 必 須 是 char, int2, int4 或 double; 預 設 是 int4。

storage

該 資 料 型 別 的 儲 存 策 略 。 如 果 聲 明 瞭 , 必 須 是 plain, external, extended, 或 main; 預 設 是 plain。

default

該 型 別 的 預 設 值 。 通 常 是 省 略 它 的 , 所 以 預 設 是 NULL。

element

被 建 立 的 型 別 是 陣 列 ; 這 個 宣 告 陣 列 元 素 的 型 別 。

delimiter

將 用 做 陣 列 的 資 料 元 素 之 間 分 隔 符 的 字 元 。

NOTES 注 意

使 用 者 定 義 型 別 名 不 能 以 下 劃 線 ( _) 開 頭 而 且 只 能 有 62 個 字 元 長 。 ( 或 者 通 常 是 NAMEDATALEN-2, 而 不 是 其 它 名 字 那 樣 的 可 以 有 NAMEDATALEN-1 個 字 元 ) 。 以 下 劃 線 開 頭 的 型 別 名 被 解 析 成 內 部 建 立 的 陣 列 型 別 名 。

在 PostgreSQL 版 本 7.3 以 前 , 我 們 要 透 過 使 用 佔 位 偽 型 別 opaque 代 替 函 式 的 前 向 引 用 來 避 免 建 立 殼 型 別 。 7.3 之 前 cstring 引 數 和 結 果 同 樣 需 要 宣 告 偽 opaque。 要 支 援 裝 載 舊 的 轉 儲 外 那 間 , CREATE TYPE 將 接 受 那 些 用 opaque宣 告 的 函 式 , 但 是 它 回 發 出 一 條 通 知 並 且 用 正 確 的 型 別 改 變 函 式 的 宣 告 。

EXAMPLES 例 子

這 個 例 子 建 立 一 個 複 合 型 別 並 且 在 一 個 函 式 定 義 中 使 用 它 :

CREATE TYPE compfoo AS (f1 int, f2 text);
CREATE FUNCTION getfoo() RETURNS SETOF compfoo AS
’SELECT fooid, fooname FROM foo’ LANGUAGE SQL;

這 個 命 令 建 立 box資 料 型 別 , 並 且 將 這 種 型 別 用 於 一 個 表 定 義 :

CREATE TYPE box (
INTERNALLENGTH = 16,
INPUT = my_box_in_function,
OUTPUT = my_box_out_function
);

CREATE TABLE myboxes (
id integer,
description box
);

如 果 box 的 內 部 結 構 是 一 個 四 個 float4 的 陣 列 , 我 們 可 以 說

CREATE TYPE box (
INTERNALLENGTH = 16,
INPUT = my_box_in_function,
OUTPUT = my_box_out_function,
ELEMENT = float4
);

它 允 許 一 個 box 的 數 值 成 分 成 員 可 以 用 腳 標 訪 問 。 否 則 該 型 別 和 前 面 的 行 為 一 樣 。

這 條 命 令 建 立 一 個 大 物 件 型 別 並 將 其 用 於 一 個 表 定 義 :

CREATE TYPE bigobj (
INPUT = lo_filein, OUTPUT = lo_fileout,
INTERNALLENGTH = VARIABLE
);
CREATE TABLE big_objs (
id integer,
obj bigobj
);

更 多 的 例 子 , 包 括 合 適 的 輸 入 和 輸 出 函 式 , 在 Chapter 31‘‘Extending SQL’’ in the documentation。

COMPATIBILITY 相 容 性

CREATE TYPE 命 令 是 PostgreSQL 擴 充 套 件 。 在 SQL99 裡 有 一 個 CREATE TYPE 語 句 , 但 是 細 節 上 和 PostgreSQL 的 有 比 較 大 區 別 。

SEE ALSO 參 見

CREATE FUNCTION [ create_function (7)], DROP TYPE [ drop_type (l)]

譯 者

Postgresql 中 文 網 站 何 偉 平 <laser@pgsqldb.org>

本 頁 面 中 文 版 由 中 文 man 手 冊 頁 計 劃 提 供 。
中 文 man 手 冊 頁 計 劃 : https://github.com/man-pages-zh/manpages-zh