CREATE TYPE

Name

CREATE TYPE — 定义一个新的基本数据类型
CREATE TYPE typename ( 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 需要在定义类型之前先注册两个函数(用创建函数命令). 新的基本类型的形式由 input_function决定, 它将该类型的外部形式转换成可以被对该类型操作的操作符和函数识别的形式. 自然, output_function 用做相反用途.输入和输出函数都必须定义成接收一个或两个类型为 "opaque". 的参数的函数.

新的基本数据类型可定义成为定长,这时 internallength 是一个正整数,也可以是变长的,这时Postgres 假定新类 型的格式和 Postgres 所支持的 "text" 类型是一样的. 要指明一个类型是变长,将 internallength 设成 VARIABLE. 类似的,外部形式也用 externallength 关键字声明.

要指明一个类型是数组以及指明一个类型有数组元素. 应该使用element关键字.例如,定义一个4-字节整数的数组 ("int4"),声明如下

ELEMENT = int4

要声明用于这种类型数组的分隔符,可设置 delimiter 声明分隔符.缺省的分隔符是逗号 ( ",").

一个可选的的缺省值可用于令用户声明某种位模式来代表"数据不存在". 用 DEFAULT 关键字声明缺省值.

可选的参数 send_functionreceive_function 用于请求 Postgres 服务的应用程序和 Postgres 数据库不在同 一台机器的场合. 在这种情况下, Postgres 运行的机器所用的数据类型格式可能和远端机器的不一样. 在这种情况下,将服务器到客户端的数据转换成一个标准格式, 当服务器收到从客户端来的数据时再转换成机器的格式是合适的.如果 没有这样的函数声明,就假设内部数据格式可以被任何相关的硬件体系接受. 比如, 如果在一台 Sun-4 和一台DECstation 之间传递数据, 单字节数据就不必转换,但许多其他类型需要(转换).

可选的标签 PASSEDBYVALUE 表明使用该数据类型的操作符或函数应该传递一个参数的值而不是引用(形参). 要注意对内部格式超过4字节的类型你不能传递参数值.

storage 关键字 允许为变长数据类型选择 TOAST 存储方法 (定长类型只允许使用 plain). plain 为该数据类型关闭 TOAST:它将 总是用内联的方式而不是压缩的方式存储. extended 是 TOAST 完全兼容的:系统将首先试图压缩 一个长的数据值,然后如果它仍然太长的话就将它的值移出主表的行. external 允许将值移出主表的行,但系统将不会压缩它. main 允许压缩,但是不赞成把数值移动出主表. (用这种存储方法的数据项可能仍将移动出主表,如果不能放在一行里的话, 但是它们将比 extendedexternal 项更愿意呆在主表里.)

对于新的基本类型, 用户可以通过本节描述的一些功能定义操作符,函数和聚集.

数组类型

两个通用内建函数,array_in 和 array_out,用于快速建立变长数组类型. 这些函数可对任何现存的 Postgres 数据类型进行操作.

例子

这个命令创建长方形数据类型,并且将这种类型用于一个表定义:

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 获取删除一个类型的信息.

请参阅 PostgreSQL 程序员手册CREATE FUNCTIONCREATE OPERATOR 和大对象的章节获取更多信息.

兼容性

SQL3

CREATE TYPESQL3 语句.