Man page - create_type(7)
Manual
CREATE TYPE
NAMESYNOPSIS
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