pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
CREATE TYPE — 定义一种新的基本数据类型
CREATE TYPEtypename( INPUT =input_function, OUTPUT =output_function, INTERNALLENGTH = {internallength| VARIABLE } [ , EXTERNALLENGTH = {externallength| VARIABLE } ] [ , DEFAULT = "default" ] [ , ELEMENT =element] [ , DELIMITER =delimiter] [ , SEND =send_function] [ , RECEIVE =receive_function] [ , PASSEDBYVALUE ] [ , ALIGNMENT =alignment] [ , STORAGE =storage] )
typename要创建的类型的名称。
internallength一个字面值,指定新类型的内部长度。
externallength一个字面值,指定新类型的外部(显示)长度。
input_function一个由 CREATE FUNCTION 创建的函数的名称,它把数据从外部形式转换为该类型的内部形式。
output_function一个由 CREATE FUNCTION 创建的函数的名称,它把数据从内部形式转换为适合显示的形式。
element正在创建的类型是数组;该参数指定数组元素类型。
delimiter数组元素的分隔符字符。
default该数据类型的默认值。通常省略此项,使默认值为 NULL。
send_function一个由 CREATE FUNCTION 创建的函数的名称,它把该类型的数据转换为适合传输到另一台机器的形式。
receive_function一个由 CREATE FUNCTION 创建的函数的名称,它把该类型的数据从适合从另一台机器传输的形式转换为内部形式。
alignment该数据类型的存储对齐要求。如果指定,必须是 'int4' 或 'double';默认为 'int4'。
storage该数据类型的存储技术。如果指定,必须是 'plain'、'external'、 'extended' 或 'main';默认为 'plain'。
CREATE类型创建成功时返回的消息。
CREATE TYPE 允许用户向 Postgres 注册一种新的用户数据类型,供当前数据库使用。定义类型的用户将成为其所有者。 typename 是新类型的名称,在该数据库已定义的类型中必须唯一。
CREATE TYPE 要求在定义类型之前(用 create function)先注册两个函数。新基本类型的表示由 input_function 决定,它把该类型的外部表示转换为为该类型定义的操作符和函数可用的内部表示。自然, output_function 执行反向的转换。输入和输出函数都必须声明为接受一个或两个 "opaque" 类型的参数。
新的基本数据类型可以是定长的,这时 internallength 是一个正整数;也可以是变长的,这时 Postgres 假定新类型与 Postgres 内置的数据类型 "text" 具有相同的格式。要指明一个类型是变长的,把 internallength 设为 VARIABLE。外部表示用 externallength 关键字以类似的方式指定。
要指明一个类型是数组并指明它有数组元素,可以用 element 关键字指定数组元素的类型。例如,要定义一个 4 字节整数("int4")的数组,指定
ELEMENT = int4
要指明该类型数组上使用的分隔符,可以把 delimiter 设为某个特定的字符。默认分隔符是逗号(",")。
如果用户希望某个特定的位模式表示"数据不存在",可以选择性地提供一个默认值。用 DEFAULT 关键字指定默认值。
可选参数 send_function 和 receive_function 用于请求 Postgres 服务的应用程序位于另一台机器上的情形。在这种情况下, Postgres 所在机器为该数据类型使用的格式可能与远程机器使用的格式不同。此时,服务器向客户端发送数据时把数据项转换为标准形式,而在服务器从客户端接收数据时从标准格式转换为机器特定的格式,是恰当的做法。如果不指定这两个函数,就假定该类型的内部格式在所有相关机器体系结构上都是可接受的。例如,单个字符从 Sun-4 传到 DECstation 不需要转换,但许多其他类型需要。
可选标志 PASSEDBYVALUE 表示使用该数据类型的操作符和函数应按值而不是按引用传递参数。注意,内部表示超过 4 字节的类型不能按值传递。
storage 关键字允许为变长数据类型选择存储策略(定长类型只允许 plain)。 plain 对该数据类型禁用 TOAST:它总是内联存储且不压缩。 extended 提供完整的 TOAST 能力:系统会先尝试压缩较长的数据值,如果仍然太长,就把该值移出主表行。 external 允许把值移出主表,但系统不会尝试压缩它。 main 允许压缩,但不鼓励把值移出主表。(采用这种存储方法的数据项在实在没有其他办法让行放得下时仍可能被移出主表,但相比 extended 和 external 的数据项,它们会被优先保留在主表中。)
对于新的基本类型,用户可以使用本节描述的相应设施定义操作符、函数和聚合。
存在两个广义的内置函数 array_in 和 array_out,用于快速创建变长数组类型。这些函数可用于任何现有 Postgres 类型的数组。
这条命令创建 box 数据类型,然后在表定义中使用该类型:
CREATE TYPE box (INTERNALLENGTH = 8,
INPUT = my_procedure_1, OUTPUT = my_procedure_2);
CREATE TABLE myboxes (id INT4, description box);
这条命令创建一个带整数元素的变长数组类型:
CREATE TYPE int4array (INPUT = array_in, OUTPUT = array_out,
INTERNALLENGTH = VARIABLE, ELEMENT = int4);
CREATE TABLE myarrays (id int4, numbers int4array);
这条命令创建一个大对象类型并在表定义中使用它:
CREATE TYPE bigobj (INPUT = lo_filein, OUTPUT = lo_fileout,
INTERNALLENGTH = VARIABLE);
CREATE TABLE big_objs (id int4, obj bigobj);
类型名不能以下划线字符("_")开头,且长度只能是 31 个字符。这是因为 Postgres 会为每个基本类型悄悄创建一个数组类型,其名称由基本类型名前加下划线组成。
参见 DROP TYPE 以删除现有类型。
另请参阅 CREATE FUNCTION、 CREATE OPERATOR 以及 PostgreSQL 程序员指南中关于大对象的章节。
CREATE TYPE 是一个 SQL3 语句。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。