字段定义
使用 Field Definition 子句在已命名的 ROW 类型中定义新的字段。
字段定义当已命名的 EOW 类型的类型表被创建时,已命名的 ROW 类型字段上的 NOT NULL 约束适用于相应的列。
对序列和简单大对象数据类型的限制序列和简单大对象数据类型不能嵌套在表中。因此,如果 ROW 类型包含 BYTE 、TEXT 、SERIAL 、BIGSERIAL 或 SERIAL8 字段,则不能使用 ROW 类型在并非基于 ROW 类型的表中定义列。例如,以下代码示例产生一个错误:
CREATE ROW TYPE serialtype (s serial, s8 serial8);
CREATE TABLE tab1 (col1 serialtype); --INVALID CODE
不能创建有存储在单独存储空间中的 BYTE 或 TEXT 值的 ROW 类型。即,不能使用 IN 子句指定存储位置。
例如,以下示例产生一个错误:
CREATE ROW TYPE row1 (field1 byte IN blobspace1); --INVALID CODE
表层次结构只能包含一个 SERIAL 、BIGSERIAL 或 SERIAL8 列。如果超级表包含 SERIAL列,则没有子表能够包含 SERIAL 列。(但是如果没有其它子表包含 BIGSERIAL 或 SERIAL8列,则子表可以拥有 BIGSERIAL 或 SERIAL8 列。)从而,当创建表层次结构所依据的已命名的ROW 类型时,它们最多可以包含这些类型中的一个 SERIAL 和一个 BIGSERIAL 或 SERIAL8字段。
不能用 CREATE ROW TYPE 语句设置起始 SERIAL 、BIGSERIAL 或 SERIAL8 值。要修改序列字段的值,必须使用 ALTER TABLE 语句的 MODIFY 子句或使用 INSERT 语句插入大于当前最大(或缺省)序列值的一个值。 ROW 类型中的序列字段在表层次结构上具有性能影响。要将数据插入超级表(或其超级表)包含序列计数器的子表中,数据库服务器还必须打开超级表,更新序
列值并关闭该超级表,从而添加额外开销。
在对 SERIAL 、BIGSERIAL 或 SERIAL8 数据类型发出的限制或性能与您的设计目标冲突的上下文中,可能要考虑使用序列对象来模拟序列字段或序列列的功能。