|
CREATE TYPESynopsisCREATE 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 ] ) 输入
描述CREATE TYPE 允许用户在 PostgreSQL 当前数据库里创建一个新的用户数据类型. 定义该类型的用户成为其所有者. typename 是新类型的名称而且必须在所定义的数据库中唯一. CREATE TYPE 需要在定义类型之前先注册两个函数(用 CREATE FUNCTION 命令). 新的基本类型的形式由 input_function 决定, 它将该类型的外部形式转换成可以被对该类型操作的操作符和函数识别的形式. 自然, output_function 用做相反用途. 输入函数可以声明为接受一个类型为 opaque 的参数,或者接受三个类型分别为 opaque , OID , int4 的参数. (第一个参数是 C 字串形式的输入文本,第二个是在该类型为数组类型时 其元素的类型,第三个是目标字段的 typmod,如果已知的话.) 输出函数可以声明为接受一个类型为 opaque 的参数, 或者接受两个类型为 opaque , OID 的参数. (第一个参数实际上是数据类型本身,但是因为输出函数必须首先声明, 所以把它声明为接受 opaque 类型更简单.第二个参数也是 用于数组类型的数组元素类型.) 新的基本数据类型可定义成为定长,这时 internallength 是一个正整数,也可以是变长的,通过把 internallength 设置为 VARIABLE 表示.(在内部,这个状态 是通过将 typlen 设置为 -1 实现的.)所有变长类型的内部形式 都必须以一个整数开头,这个整数给出此类型这个数值的全长. 外部表现形式的长度类似使用 externallength 关键字 声明.(目前这个值没有使用,通常是省略的,这样就缺省是 VARIABLE .) 要表示一个类型是数组,用 ELEMENT 关键字声明数组元素的 类型.比如,要定义一个 4 字节整数("int4")的数组,声明 ELEMENT = int4 有关数组类型的更多细节在下面描述. 要声明用于这种类型数组的外部形式的数值之间的分隔符,可用 delimiter 声明指定分隔符.缺省的分隔符是逗号(' , '). 请注意分隔符是和数组元素类型相关联,而不是数组类型本身. 如果用户希望字段的数据类型缺省时不是 NULL,而是其它什么东西, 那么你可以声明一个缺省值. 在 DEFAULT 关键字里面声明缺省值. (这样的缺省可以被附着在特定字段上的明确的 DEFAULT 子句覆盖.) 可选的参数 send_function 和 receive_function 目前还没有使用,并且通常被忽略(允许它们分别缺省为 output_function 和 input_function .) 这些函数将来可能复活过来用于声明与机器相关的二进制表现. 可选的标签 PASSEDBYVALUE 表明该数据类型是通过传值传递的而不是传引用. 请注意你不能对那些内部形式超过 Datum 类型宽度 (大多数机器上是四字节,有少数机器上是八字节.) 的类型进行传值. alignment 关键字 声明该数据类型要求的对齐存储方式.允许的数值等效于按照 1,2, 4,或者 8 字节边界对齐.请注意变长类型必须有至少 4 字节的对齐, 因为它们必须包含一个 int4 作为它们的第一个成份. storage 关键字 允许为变长数据类型选择 TOAST 存储方法 (定长类型只允许使用 plain ). plain 为该数据类型关闭 TOAST:它将 总是用内联的方式而不是压缩的方式存储. extended 是 TOAST 完全兼容的:系统将首先试图压缩 一个长的数据值,然后如果它仍然太长的话就将它的值移出主表的行. external 允许将值移出主表的行,但系统将不会压缩它. main 允许压缩,但是不赞成把数值移动出主表. (用这种存储方法的数据项可能仍将移动出主表,如果不能放在一行里的话, 但是它们将比 extended 和 external 项更愿意呆在主表里.) 数组类型在创建用户定义数据类型的时候, PostgreSQL 自动创建一个与之关联的数组类型,其名字由该基本类型的名字前缀一个 下划线组成.分析器理解这个命名传统,并且把对类型为 foo[] 的字段的请求转换成对类型为 _foo 的字段的请求.这个隐含创建的数组类型是变长并且 使用内建的输入和输出函数 array_in 和 array_out . 你很可能会问 "如果系统自动制作正确的数组类型,那为什么有个 ELEMENT 选项?" 使用 ELEMENT 有用的唯一 的场合是在你制作的定长类型碰巧在内部是一个 N 个相同事物的数组, 而你又想允许这 N 个事物可以通过脚标直接关联,以及那些你准备 把该类型当做整体进行的操作.比如,类型 name 就允许其 构成 char 用这种方法关联.一个二维的 point 类型也可以允许其两个构成浮点型按照类似 point[0] 和 point[1] 的方法关联. 请注意这个功能只适用与那些内部形式完全是 N 个相等字段的定长类型. 一个可以脚标化的变长类型必须有被 array_in 和 array_out 使用的一般化的 内部表现形式.出于历史原因(也就是说,那些明显错误但补救来得太迟的 问题),定长数组类型的脚标从零开始,而不是象变长类型那样的从一开始. 注意类型名不能以下划线( " _ " ) 开头而且只能有 30 个字符长.(或者通常是 NAMEDATALEN-2 , 而不是其它名字那样的可以有 NAMEDATALEN-1 个字符). 以下划线开头的类型名被解析成内部创建的数组类型名. 例子这个命令创建 box 数据类型,并且将这种类型用于一个表定义: CREATE TYPE box (INTERNALLENGTH = 16, INPUT = my_procedure_1, OUTPUT = my_procedure_2); CREATE TABLE myboxes (id INT4, description box);
如果 box 的内部结构是一个四个 float4 的数组,我们可以说 CREATE TYPE box (INTERNALLENGTH = 16, INPUT = my_procedure_1, OUTPUT = my_procedure_2, ELEMENT = float4); 它允许一个 box 的数值成分 float 可以用脚标关联. 否则该类型和前面的行为一样. 这条命令创建一个大对象类型并将其用于一个表定义: CREATE TYPE bigobj (INPUT = lo_filein, OUTPUT = lo_fileout, INTERNALLENGTH = VARIABLE); CREATE TABLE big_objs (id int4, obj bigobj);
|