返回首页

gbase数据、南大通用产品文档:GBase8sCREATE ROW TYPE 语句

更新日期:2024年09月11日

使用 CREATE ROW TYPE 语句创建命名的 ROW 类型。
该语句是 SQL ANSI/ISO 标准的扩展。
语法

元素
描述
限制
语法
row_type
此处为已命名的新的
ROW 数据类型
请参阅 创建子类型的过程
标识符
supertype
类型继承层次结构中
超类型的名称
必须已经作为已命名的 ROW 类
型在数据库中存在
数据类

用法
CREATE ROW TYPE 语句声明已命名的 ROW 数据类型并在当前系统目录中注
册。可以将已命名的 ROW 数据类型分配给表或视图,以创建类型表或类型视
图。您也可以将列定义为命名 ROW 类型。尽管您能分配一个 ROW 类型到表来
定义表模式,但是 ROW 数据类型与表行不同。表行由一个或多个列构成;ROW
数据类型由一个或多个字段构成,使用 Field Definition 语法定义。
已命名的 ROW 数据类型在大多数您可指定数据类型的上下文中有效。已命名的
ROW 类型是强类型。没有两个已命名的 ROW 类型是相等的,即使它们结构上
相等。
没有标识符的 ROW 类型称为 unnamed ROW 类型。任何两个未命名 ROW 类
型被认为是相等的(如果它们结构上相等)。有关更多信息,请参阅 ROW 数据
类型 。
在命名 ROW 类型列上的特权与任何其它列上的特权相同。有关更多信息,请参
阅 表级权限。(要查看列上拥有的特权,请检查 syscolauth 系统目录表,该系
统目录表在 GBase 8s SQL 参考指南 中有描述。)

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 325
如果您包含可选的 IF NOT EXISTS 关键字,则当指定名称的已命名的 ROW 已
经在当前数据库中注册时,数据库服务器不采取操作(而非向应用程序发送异
常)。
在命名 ROW 数据类型上的特权
在类型表上操作所需的自由访问特权(被指定已命名的 ROW 数据类型的表)与
任何表上的特权相等。有关更多信息,请参阅 表级权限。下表显示要创建命名的
ROW 类型必须具有哪些特权。
任务
需要的特权
创建命名 ROW 类型
数据库上的资源特权
按照超类型下子类型创建命名 ROW 类

在超类型的特权下,以及 Resource
特权
有关 Resource 和 Under 特权以及特权上下文中 ALL 关键字的信息,请参阅
GRANT 语句 。
要找出 ROW 类型上存在什么特权,在 sysxtdtypes 系统目录表中检查所有者名
称,并在 sysxtdtypeauth 系统目录表中检查可能已经授权给用户或角色的 ROW
类型上的特权。
要找出在给定表上有什么特权,检查 systabauth 系统目录表。有关系统目录表的
更多信息,请参阅 GBase 8s SQL 参考指南 。
继承和命名 ROW 类型
已命名的 ROW 类型属于继承层次结构,作为子类型或超类型。使用 CREATE
ROW TYPE 语句中的 UNDER 子句将已命名的 ROW 数据类型作为现有的
ROW 数据类型的子类型创建。
超类型必须也是已命名的 ROW 数据类型。如果在现有的超类型下创建已命名的
ROW 数据类型,那么新的类型名称 row_type 称为子类型的名称。
当将命名 ROW 类型创建为子类型时,子类型继承超类型的所有字段。另外,当
创建此子类型时,您可以向其添加新的字段。新的字段单独特定于子类型。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 326
不能将继承层次结构中的 ROW 类型替换其超类型或子类型。例如,考虑
person_t 是超类型且 employee_t 是子类型的类型层次结构。如果列是类型
person_t ,则该列仅能包含 person_t 数据。它不能包含 employee_t 数据。同样
地,如果列是类型 employee_t ,则列仅能包含 employee_t 数据。它不能包含
person_t 数据。
创建子类型
大多数情况下,当命名 ROW 类型作为另一种命名 ROW 类型(其超类型)的子
类型创建时候您添加新的字段。要创建命名的 ROW 类型的字段,请使用 字段
定义 中描述的字段定义子句。当创建子类型时,必须使用 UNDER 关键字来将
超类型与希望创建的已命名 ROW 类型相关联。下一个示例将在 person_t 类型
下创建 employee_t 类型:
CREATE ROW TYPE employee_t (salary NUMERIC(10,2),
bonus NUMERIC(10,2)) UNDER person_t;
employee_t 类型继承 person_t 的所有字段并有两个另外的字段:salary 和
bonus ;但是 person_t 类型没有改变。
类型层次结构
当创建子类型时,会创建类型层次结构。在类型层次结构中每个您创建的子类型
从单个超类型继承其属性。如果在 person_t 下创建命名 ROW 类型
customer_t ,customer_t 继承 person_t 的所有字段。如果您在 customer_t 下
创建另一个命名 ROW 类型 salesrep_t ,则 salesrep_t 继承 customer_t 的所有
字段。
因此,salesrep_t 继承所有 customer_t 从 person_t 继承的字段,以及所有特别
为 customer_t 定义的字段。有关类型继承的讨论,请参阅 GBase 8s SQL 教程
指南 。
创建子类型的过程
在您将命名 ROW 类型作为继承层次结构中子类型创建之前,请检查以下消息:

验证您已授权创建新的数据类型。必须在数据库上拥有 Resource 特权。
可以在 sysusers 系统目录表中找到此信息。

验证超类型存在。可以在 sysxtdtypes 系统目录表中找到此信息。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 327

验证您已授权创建该超类型的子类型。必须拥有超类型上的 Under 特
权。可以在 sysusers 系统目录表中找到此信息。

验证您已命名 ROW 类型声明的名称是唯一的。在兼容 ANSI 的数据库
中,owner.type 组合必须在数据库中是唯一的。要验证新的数据类型的名
称是否唯一的。在不兼容 ANSI 的数据库中,名称必须在数据库中的数
据类型名称中是唯一的,要验证新的数据类型的名称是否唯一,请检查
sysxtdtypes 系统目录表,名称必须不是现有数据类型的名称。

如果您正在为 ROW 类型定义字段,则检查没有复制字段名称同时存在
于新的和继承的字段中。
重要: 当创建子类型时,不能重新定义它为其超类型继承的字段。如果您试图重
新定义这些字段,则数据库服务器返回一个错误。
不能将约束应用到已命名 ROW 数据类型,但是可以在创建或更改使用已命名
ROW 类型的表时指定约束。您也可以在某个单独的 ROW 类型的字段上指定
NOT NULL 约束。
字段定义
使用 Field Definition 子句在已命名的 ROW 类型中定义新的字段。
字段定义

元素
描述
限制
语法
data_type
字段的数据类型
请参阅 对序列和简单大对象数据
类型的限制 。
标识符
field
row_type 中字段的
名称
在此 ROW 类型及其超类型的字段
名称中必须是唯一的
标识符
当已命名的 EOW 类型的类型表被创建时,已命名的 ROW 类型字段上的 NOT
NULL 约束适用于相应的列。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 328
对序列和简单大对象数据类型的限制
序列和简单大对象数据类型不能嵌套在表中。因此,如果 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 数据类型发出的限制或性能与您的设
计目标冲突的上下文中,可能要考虑使用序列对象来模拟序列字段或序列列的功
能。

执行SQL 语句

构造操作语句,使用%s 作为占位符,执行时psycopg2 会用参数值智能替换掉占位符。
可以添加RETURNING 子句,来得到自动生成的字段值。

使用cursor.execute 方法来操作一行,使用cursor.executemany 方法来操作多行。

功能描述
REFRESH MATERIALIZED VIEW 会以全量刷新的方式对物化视图进行刷新。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1207
注意事项
全量刷新既可以对全量物化视图执行,也可以对增量物化视图执行。
刷新物化视图需要当前用户拥有基表的SELECT 权限。
语法格式
REFRESH [ INCREMENTAL ] MATERIALIZED VIEW name;
参数说明

mv_name
要刷新的物化视图的名称。
示例
--创建一个普通表
gbase=#CREATE TABLE my_table (c1 int, c2 int);
--创建全量物化视图
gbase=#CREATE MATERIALIZED VIEW my_mv AS SELECT * FROM my_table;
--创建增量物化视图
gbase=#CREATE INCREMENTAL MATERIALIZED VIEW my_imv AS SELECT *
FROM my_table;
--基表写入数据
gbase=#INSERT INTO my_table VALUES(1,1),(2,2);
--对全量物化视图my_mv 进行全量刷新
gbase=#REFRESH MATERIALIZED VIEW my_mv;
--对增量物化视图my_imv 进行全量刷新
gbase=#REFRESH MATERIALIZED VIEW my_imv;
相关命令

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
1208
ALTER MATERIALIZED VIEW,CREATE INCREMENTAL MATERIALIZED VIEW,
CREATE MATERIALIZED VIEW,CREATE TABLE,DROP MATERIALIZED VIEW,
REFRESH INCREMENTAL MATERIALIZED VIEW