OF TYPE 子句
使用 OF TYPE 子句为对象关系数据库创建类型表。类型表是您将已命名的 ROW 数据类型指定到目标表。
OF TYPE 子句
元素 | 描述 | 限制 | 语法 |
row_type | 该表所基于的 ROW 类型的名称 | 必须是在本地数据库中注册的已命名 ROW 数据类型 | 标识符 |
supertable | 该表继承其属性的表名称 | 必须作为类型表存在 | 标识符 |
如果您使用 UNDER 子句,则 row_type 必须从 supertable 的 ROW 类型派生得到。类型层次结构必须已经存在,其中新表的已命名 ROW 类型是 supertable 的已命名 ROW 类型的子类型。
不规则行是来自表层次结构的一组行的集合,层次结构中的类型表的列数不固定。一些 API ,例如 GBase 8s ESQL/C 和 GBase 8s JDBC Driver,不支持返回 jagged 行的查询。
当创建类型表时,CREATE TABLE 不能为它的列指定名称,因为列名称在创建 ROW 类型时已经声明了。类型表的列对应于指定 ROW 类型的字段。ALTER TABLE 已经不能向类型表添加其它列。
例如,假设您创建一个指定的 ROW 类型 student_t 如下:
CREATE ROW TYPE student_t
(name VARCHAR(30),
average REAL,
birthdate DATETIME YEAR TO DAY);
如果在 OF TYPE 子句中为表指定 student_t 类型,则该表是一张类型表,该表的列与指定 ROW 类型 student_t 的字段名称和数据类型都相同(顺序也相同)。 例如,以下 CREATE TABLE 语句创建了一个类型是 student_t 的名为 students 的类型表:
CREATE TABLE students OF TYPE student_t;
students 表有以下列:
name VARCHAR(30)
average REAL
birthdate DATETIME YEAR TO DAY
有关指定 ROW 类型的更多信息,请参阅 CREATE ROW TYPE 语句 。
在类型表中使用大对象数据
如果您想要创建的表中包含大对象的列,则使用 BLOB 或 CLOB ,而不要使用 BYTE 或 TEXT 数据类型。为保持向后兼容性,您可以创建包含 BYTE 或 TEXT 字段的指定 ROW 类型,并使用该 ROW 类型将现有的(未归类的)表重新创建为类型表。尽管您可以使用包含 BYTE 或 TEXT 字段的指定 ROW 类型来创建类型表,但是这种 ROW 类型作为列是无效的。然而,可以在类型表和列中使用包含 BLOB 或 CLOB 字段的 ROW 类型。
使用 UNDER 子句
使用 UNDER 子句来指示继承(即,将表定义为子表)。子表从它上面的超级表那里继承属性。此外,您还可以为子表定义新属性。
继续 OF TYPE 子句中的示例,以下语句创建了一个类型表 grad_students ,它继承了 students 表的所有列,同时还有对应于 grad_student_t ROW 类型中字段的 adviser 和 field_of_study 这两列:
CREATE ROW TYPE grad_student_t
(adviser CHAR(25),
field_of_study CHAR(40)) UNDER student_t;
CREATE TABLE grad_students OF TYPE grad_student_t UNDER students;
使用 UNDER 子句时,子表将继承这些属性:
- 超级表中的所有列
- 超级表上定义的所有约束
- 超级表上定义的所有索引
- 超级表上定义的所有触发器
- 参照完整性约束
- 存取方法
- 存储方法(包含分片存储策略)
如果子表未定义分片,但它的超级表定义了分片,则该子表将继承超级表的分片。
提示: 当子表已经创建后,被添加到超级表的可继承属性将自动被现有子表继承。创建子表前不需要为超级表添加所有可继承的属性。
表层级结构上的限制
继承只在一个方向发生,即从超级表到子表。子表的属性将不被超级表继承。系统目录信息的这节列出继承的数据库对象,在系统目录中没有关于这些子表的信息。
表层次结构中不能有连个表具有相同的数据类型。例如,以下的代码示例的最后一行是无效的,因为表 tab2 和 tab3 不能有相同的行类型(rowtype2):
create row type rowtype1 (...);
create row type rowtype2 (...) under rowtype1;
create table tab1 of type rowtype1;
create table tab2 of type rowtype2 under tab1;
create table tab3 of type rowtype2 under tab1; -- This is not valid.