返回首页

gbase数据、南大通用产品文档:GBase8s创建不透明类型和 UDR

更新日期:2024年09月11日

UDTManager 和 UDRManager 类可以使您更加容易地在数据库服务器中创建和部署不透明
类型和用户定义的例程(UDR)。
在使用本节中信息之前,请阅读以下两个手册:

有关配置您的系统支持 Java™ UDR 的信息,请参阅 J/Foundation 开发者指南。

有关开发不透明类型的详细信息,请参阅 GBase 8s 用户定义的例程和数据类型开
发者指南 。


GBase 8s JDBC Driver 程序员指南
南大通用数据技术股份有限公司
- 171
-

函数说明
返回time 对应的秒数,范围为0~59。
示例
示例1:返回“10:05:03”对应的秒数。
gbase> SELECT SECOND('10:05:03') FROM dual;
+--------------------+
| SECOND('10:05:03') |
+--------------------+
|
3 |
+--------------------+
1 row in set

使用 CREATE TABLE 语句在当前数据库中创建新的永久表。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 350
可以使用 CREATE TABLE 语句来创建关系数据库表或类型表(对象关系型
表)。有关创建临时表的信息,请参阅 CREATE TEMP TABLE 语句 。有关如
何创建不存储在数据库中的外部表对象的信息,请参阅 CREATE EXTERNAL
TABLE 语句 。
语法

表定义

WITH 选项


GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 351
元素
描述
限制
语法
table 在这里为新的表
声明的名称
在数据库中的表、视图、和序列的名
称中必须是唯一的
标识符
用法
当您创建表时,必须声明它的名称,定义它的结构和它的日志记录状态。可以如
随后的章节所标识的那样可选地指定其他属性。该语法图显示了需要的或可选的
规范的序列。CREATE TABLE 语句的语法段,和一些它们的组件都标识在一下
的五个列表中。
下列关键字和子句定义新的列的属性:
表 1. 定义列的名称、数据类型、缺省值和安全标签
规范
主题
该关键字或子句定义的内

列定义
列定义
列的名称和属性,包括数
据类型、约束、缺省值
DEFAULT
DEFAULT 子句
列的缺省值
COLUMN SECURED
WITH
列定义
受保护的表的 LBAC 标签
以下关键字和子句在新表上定义约束:
表 2. 在表的一列或多列上定义约束
规范
主题
该关键字或子句定义的内容
单列约束
单列约束格式
单列上的数据库完整性约束、
参照完整性约束或其它约束
约束定义
约束定义
表上约束的名称、属性和启用
或禁用的状态
NULL
使用 NULL 约束
列允许 NULL 值
NOT NULL
使用 NOT NULL 约束
列不允许 NULL 值

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 352
规范
主题
该关键字或子句定义的内容
UNIQUE or
DISTINCT
使用 UNIQUE 或
DISTINCT 约束
列不允许重复的值
CHECK
CHECK 子句
检查其它列的约束
PRIMARY KEY
使用 PRIMARY KEY 约束 表中的每一行包含一个非
NULL 的唯一值
FOREIGN KEY
使用 FOREIGN KEY 约束 建立表之间的依赖
REFERENCES
REFERENCES 子句
与其它列的参照完整性约束
多列约束
多列约束格式
列集合上的数据完整性约束
下列关键字和子句定义了该表的影子列和行级别审计支持:
表 3. 定义影子列和行级别审计支持
规范
主题
该关键字或子句定义的内容
WITH keyword
Options 子句
影子列或行级别审计支持的关
键字选项
WITH AUDIT
使用 WITH AUDIT 子句
行级别审计支持
WITH CRCOLS
使用 WITH CRCOLS 选项
影子列或行级别审计支持的关
键字选项
WITH ERKEY
使用 WITH ERKEY 关键字 Enterprise Replication 定
义主键的 3 个影子列
WITH REPLCHECK
使用 WITH REPLCHECK 关
键字
在完整性检查中使用的影子列
WITH ROWIDS
使用 WITH ROWIDS 选项
已分片表中的隐藏列(不推荐
使用)
WITH VERCOLS
使用 WITH VERCOLS 选项 辅助服务器上用于 UPDATE 操
作的 2 个影子列
下列关键字和子句定义新表的存储选项:

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 353
表 4. 定义新表或其智能大对象列的存储
规范
主题
该关键字或子句定义的内容
Storage Options
存储选项
表物理存储位置和有关表如何
存储的其它信息
IN dbspace,
sbspace,
blobspace, or
extspace
使用 IN 子句
拥有新表(或表的一部分、或
大对象)的存储对象
FRAGMENT BY or
PARTITION BY
FRAGMENT BY 子句
分片表的分布存储方案
BY ROUND ROBIN
通过 ROUND ROBIN 分片 存储表分片的 dbspace 列表
BY EXPRESSION
表达式分片子句
基于表达式的分片分布
BY LIST
列表分片子句
基于列表的分片分布
BY RANGE . . .
INTERVAL
Interval fragment 子句 基于 RANGE INTERVAL 的分片
分布
PUT 子句
PUT 子句
BLOB 或 CLOB 列的存储位
置、extent 大小以及其它
sbspace 属性
EXTENT SIZE
EXTENT SIZE 选项
表的第一个和后续的存储
extent 的大小
COMPRESSED
表的 COMPRESSED 选项
大量的行数据是否启用自动压

下列关键字和子句定义日志记录方式和其它表属性,或者向新表中插入指定查询
返回的符合条件的行。
表 5. 日志记录选项、锁定粒度、访问方法、类型表属性、数据分布统计选项、插
入来自查询结果的数据或表的 LBAC 安全策略。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 354
规范
主题
该关键字或子句定义的内容
日志记录选项
(STANDARD 或 RAW)
日志记录选项
新表的日志记录特征
LOCK MODE (PAGE
或 ROW)
LOCK MODE 选项
新表的锁定粒度
USING Access-
Method
USING 存取方法子句
如何访问新表
OF TYPE
OF TYPE 子句
在关系对象型数据库中新类型
表的已命名 ROW 类型
UNDER
使用 UNDER 子句
在类型表层次结构中新子表的
超表
SECURITY POLICY
SECURITY POLICY 子句
表的基于标签的访问控制策略
STATCHANGE,
STATLEVEL
CREATE TABLE 语句的
Statistics 选项
更改数据分布统计信息的粒度
和域
AS SELECT
AS SELECT 子句
创建并填充查询结果表
表名称和列名称的唯一性规则
当您创建新表是,每个列必须有与之相关的数据类型。列的名称在同一表的列的
名称中必须是唯一的。( OF TYPE 选项指定现有已命名 ROW 类型,其字段为
您正在创建的类型表提供列名称和列的数据类型。)
如果数据库没有被创建为 MODE ANSI ,则表名称必须在相同的数据库中的表、
视图、序列和同义词的名称中是唯一的。
在兼容 ANSI 的数据库中,组合 owner.table 必须在在相同的数据库中的表、同
义词、视图、和序列对象的名称中是唯一的。具有不同所有者名称的表对象可以
具有相同的标识符。
如果您包含了可选的 IF NOT EXISTS 关键字,则当指定名称的表已经存在于当
前数据库中时,数据库不采取操作(而非向应用程序发送异常)。
CREATE TABLE 的其它语法说明

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 355
对于在新的永久性表中存储一个查询的结果集的 CREATE TABLE 语句的受限制
的语法选项,请参阅 AS SELECT 子句 。
在 DB-Access 中,如果使用 -ansi 标识或设置 DBANSIWARN 环境变量,那么
当您在 CREATE SCHEMA 语句外使用 CREATE TABLE 时将会生成警告。
日志记录选项
使用 Logging Type 选项指定对表进行各种批量操作时可以提高性能的日志记录特
征。
除了用于 OLTP 数据库的缺省选项(STANDARD)以外,这些日志记录选项主
要用于提高数据仓库数据库的性能。
永久表可以拥有以下任一日志记录特征。
日志记录类型 作用
STANDARD 允许回滚、恢复和从归档恢复的记录表。该类型是缺省值。
对所有 OLTP 数据库需要的恢复和约束功能性使用该类型
的表。
RAW 不支持主键约束或唯一约束的非日志记录表。但是它支持引
用约束,且可以被索引和更改。使用此类型表来快速加载数
据。
注:
警告: 使用 raw 表进行数据的快速加载,但是在事务中使用表或在表中修改数
据之前将日志记录类型设置为 STANDARD 并执行 0 级备份。如果必须在事务中使
用原始表,则将隔离级别设置为 Repeatable Read 或将表锁定为互斥方式来阻止
并行性问题。
高可用集群中的辅助服务器上不支持 CREATE RAW TABLE 语句。
有关这些表的日志记录类型的更多信息,请参阅 GBase 8s 管理员指南。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 356
列定义
使用 CREATE TABLE 语句的列定义部分列出新表的单列的名称和数据类型(可
选的缺省值以及约束或安全标签)。
列定义

元素
描述
限制
语法
column 表中列的名称
在此表中必须是唯一的
标识符
由于行的最大大小是 32,767 字节,所以表中最多只能有大约 97 列可以是
COLLECTION 数据类型(SET 、LIST 和 MULTISET)。表中最多大约有195
列可以是数据类型 BYTE 、TEXT 、ROW 、LVARCHAR 、NVARCHAR 、
VARCHAR 和可变长度的 UDT。(此处的 195 列是使用 2 KB 基本页大小的平
台的最低的近似值。对于 4 KB 基本页大小的平台,如 Windows™ 和 AIX® 系
统,这些数据类型的上限值大约为 450 列。)
这些数据类型的列的数目的上限还取决于描述数据库服务器存储在同一分区的表
的其它数据。对于某些表,列数的最大值可能很小,如果压缩和存储在磁盘上的
所有的 SQL 标识符(包括数据库名称、表名称和索引名称)的聚合长度减少了
用于列的可用空间,则最大列数可能变小。
字符列大小语义
除非将 SQL_LOGICAL_CHAR 配置参数设置为在数据类型定义中的启用逻辑字
符语义,否则内置字符类型列(如 CHAR 、LVARCHAR 、NCHAR 、
NVARCHAR 或 VARCHAR)的任何显式或缺省存储大小规范以字节为单位进行
解释。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 357
将大小声明解释为逻辑字符语义可降低 INSERT 和 UPDATE 操作中列值存储不足
的风险。当数据长度超出列的最大大小时,该结果取决于数据库的 ANSI 兼容的
状态:

如果数据库不兼容 ANSI ,则 GBase 8s 删除该值。当此删除发生时不
会生成警告。

如果数据库兼容 ANSI ,则 INSERT 或 UPDATE 操作失败并返回它们
的错误。
-1279: Value exceeds string column length.
请参阅 GBase 8s 管理员参考手册 中有关 SQL_LOGICAL_CHAR 配置参数的描
述,以获取有关设置在多字节代码集(如,UTF-8)的语言环境中的效果的更多
信息,其中单个逻辑字符可能需要多个字节的存储空间。
IDSSECURITYLABEL 列上的限制
以下限制影响列定义子句指定 DSSECURITYLABEL 数据类型的列以支持基于标
签访问控制(LBAC)的使用:

如果表没有安全策略,则持有 DBSECADM 角色的用户还必须包含
SECURITY POLICY 子句以指定安全策略。

只有持有 DBSECADM 角色的用户可指定 IDSSECURITYLABEL 类型
列。

一个表只能具有一个 IDSSECURITYLABEL 类型的列。

IDSSECURITYLABEL 列不能具有列包含。

IDSSECURITYLABEL 列具有隐式的 NOT NULL 约束。如果在
DEFAULT 子句中没有为缺省的安全标签指定 label 名称,则该列的缺省
值是由用户持有的写访问权的安全标签。

IDSSECURITY LABEL 列不能有任何显式单列约束,并且它不能是多列
引用或检查约束的一部分。

IDSSECURITYLABEL 列不能被加密。
与任何 SQL 标识符一样,如果列名称是关键字,或者与表的名称相同,或者您
以后与其它表一起使用的的另一个表的名称,则可能发生语义模糊(有时还会出
现错误消息或意外行为)。有关 GBase 8s 的关键字的信息,请参阅 GBase 8s 的
SQL 关键字。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 358
如果您将表的一列定义为已命名的 ROW 类型,则该表不会采用该已命名的
ROW 的任何约束。
列安全子句
使用列安全子句给列添加基于标签的行级别安全保护。
列安全子句

元素
描述
限制
语法
label 安全标签的名称
必须存在其必须属于保护此
表的安全策略
标识符
列安全子句可以添加基于标签的行级别保护。该子句只对受安全策略保护的表有
效。有关基于标签的安全策略和表关联的语法,请参阅 SECURITY POLICY 子
句。
安全标签可以是保护该表其它行或列的相同的标签,或者它可以是同一安全策略
的不同标签。以下限制应用于 SECURED WITH 子句:

该列不能是 IDSSECURITYLABEL 类型。

指定没有策略限定符的标签,不是 policy.label 。

该标签必须是保护该表的安全策略的标签。
DEFAULT 子句
使用 DEFAULT 子句为数据库服务器指定插入列的值(当没有为列指定显式值
时)。
不能为 SERIAL 、BIGSERIAL 或 SERIAL8 列指定缺省值。
DEFAULT 子句

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

元素
描述
限制
语法
label
安全标签的名

必须存在并且属于保护该表的安全策
略。该列必须是 IDSSECURITYLABEL 类
型。
标识符
literal 字母或数字字
符的字符串
必须是适合该列的数据类型。请参阅将
文字值作为缺省值。
表达式
将 NULL 作为缺省值
如果没有为列指定缺省值,除非您在该列上放置了 NOT NULL 约束,否则缺省
值为 NULL 。在这种情况中,不存在缺省值。
如果将 NULL 指定为列的缺省值,则不能将 NOT NULL 约束指定为列定义的一
部分。(有关 NOT NULL 约束的更多信息,请参阅 使用 NOT NULL 约束。)
当列是主键的一部分时,NULL 不是该列的有效缺省值。
当列是 BYTE 或 TEXT 数据类型时,NULL 是唯一有效的缺省值。
在 GBase 8s 中,如果列是 BLOB 或 CLOB 数据类型,则 NULL 是唯一有效
的缺省值。
将文字值作为缺省值
可将文字值指定为缺省值。文字值是字母或数字字符组成的字符串。要将文字值
用作缺省值,您必须遵循以下表中的语法限制。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 360
对数据类型的列
缺省值的格式
BOOLEAN
将 't' 或 'f' (分别代表 true
或 false)用作 引用字符串 。
CHAR, CHARACTER VARYING, DATE,
VARCHAR, NCHAR, NVARCHAR, LVARCHAR
引用字符串。请参阅 DATE 后的说
明。
DATETIME
文字的 DATETIME
BIGINT, DECIMAL, FLOAT, INT8,
INTEGER, MONEY, SMALLFLOAT, SMALLINT
精确数值
INTERVAL
文字的 INTERVAL
Opaque data types
引用字符串 ,以 单列约束格式
标识
DATE 文字必须是 DBDATE (或 GL_DATE)环境变量指定的格式。在缺省的
语言环境中,如果没有设置 DBDATE 也没有设置 GL_DATE ,则日期文字必
须是 mm/dd/yyyy 的格式。
使用常量表达式作为缺省值
可以将常量表达式作为缺省列值。
下表列出了您可指定的常量表达式,以及相应的列的数据类型要求和建议的大小
(以字节为单位)。
常量表达式
数据类型要求
建议大小
CURRENT,
SYSDATE
DATETIME 列及匹配的限定符
足够的字节存储语言环
境中最长的 DATETIME

DBSERVERNAME,
SITENAME
CHAR 、VARCHAR 、NCHAR 、
NVARCHAR 或 CHARACTER
VARYING 列
128 字节
TODAY
DATE 列
足够的字节存储语言环
境中最长的 DATE 值

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 361
常量表达式
数据类型要求
建议大小
USER,
CURRENT_USER
CHAR 、VARCHAR 、NCHAR 、
NVARCHAR 或 CHARACTER
VARYING 列
32 字节
这些是我们建议的列大小,因为如果在 INSERT 或 ALTER TABLE 操作期间由
于列长度太小无法存储缺省值时,数据库服务器将返回一个错误。
您不能为保存 OPAQUE 或 DISTINCTY 数据类型的列指定行为类似可变函数的
常量表达式(即 CURRENT 、 SYSDATE 、USER 、TODAY 、SITENAME
或 DBSERVERNAME)作为缺省值。另外,如果数据值是加密或使用 UTF-8 语
言环境中 Unicode 字符集编码的话,则需要较大的列大小。(关于对加密数据所
需的存储大小的更多信息,请参阅本章随后关于 SET ENCRYPTION 语句的描
述。)
有关这些函数的描述,请参阅 常量表达式。
以下示例创建了一个名为 accounts 的数据库。在 accounts 中,acc_num 、
acc_type 和 acc_descr 列中有文字缺省值。acc_id 列的缺省值是用户的登录
名。
CREATE TABLE accounts (
acc_num INTEGER DEFAULT 1,
acc_type CHAR(1) DEFAULT 'A',
acc_descr CHAR(20) DEFAULT 'New Account',
acc_id CHAR(32) DEFAULT CURRENT_USER);
使用函数作为缺省值
可以将系统函数、自定义函数作为列的缺省值。
该功能具有以下限制:
a) 函数返回值类型与DEFAULT 对应的字段类型保持一致。
b) 函数返回值长度不得超过字段定义长度。
c) 函数的参数不能是列名。
以下示例创建了一个名为 t1 的表,并使用字符串函数设置 VARVHAR 字段 c1
的缺省值。此函数包括在 default 表达式的括号中。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 362
CREATE TABLE t1 (
c1 varchar(10) DEFAULT ( concat(‘a’,’b’) || ‘c’|| relplace(‘def’, ‘de’,
‘DD’) ),c2 INT);
使用以下语句向表 t1 插入数据,default 值的字段不设置值:
INSERT INTO t1(c2) VALUES(1);
最后,使用 select 语句查询此表。
SELECT * FROM t1;
上述查询返回结果如下,default 的字段值为函数的返回值:
c1 c2
abcDDf 1
单列约束格式
使用单列约束格式为单列定义和声明至少一个约束的名称,并指定每个约束的方
式。
使用单列约束格式为某列关联一个多多个约束。从而可以执行以下任务:

为列创建一个或多个数据完整性约束。

为约束指定一个有意义的名称。

指定在插入、删除和更新期间控制约束行为的约束方式。
单列约束格式


GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 363
NULL 约束指定列可以存储 NULL 值。它不可用于序列列或复杂数据类型的
列。如果您在同一列上指定了NOT NULL 和 NULL 约束,则 CREATE TABLE
语句发生错误并失败。
以下示例创建了有两个约束的标准表:acc_num 列上的主键约束 num ;另一个是
acc_code 列上的唯一约束 code :
CREATE TABLE accounts (
acc_num INTEGER PRIMARY KEY CONSTRAINT num,
acc_code INTEGER UNIQUE CONSTRAINT code,
acc_descr CHAR(30));
本示例中使用的约束类型将在后面的章节中定义。
使用单列约束格式的限制
单列约束格式无法指定包含多列的约束。因此,不能使用单列约束格式来定义组
合关键字。有关多列约束的信息,请参阅多列约束格式。
不能在 RAW 表的任一列上定义引用约束或唯一约束。RAW 表只支持 NOT
NULL 或 NULL 约束。
不能在 BLOB 、BYTE 、CLOB 或 TEXTY 列上放置唯一、主键、或引用约
束。但是可以使用检查约束来检查 BYTE 或 TEXT 列上的 NULL 或 non-
NULL 值。
如果约束在存储加密数据的列上,则 GBase 8s 不执行此约束。
使用 NOT NULL 约束
使用 NOT NULL 关键字来要求列必须在插入或更新操作期间接收值。如果在列
删放置了 NOT NULL 约束(并且没有指定缺省值),则当您插入一行或者某行
中更新列是,必须在该列中输入一个值。如果没有输入值,则由于不存在缺省
值,所以数据库服务器将返回一个错误。
以下示例创建了 newitems 表。在 newitems 中,列 manucode 没有缺省值也不
允许有 NULL 值。
CREATE TABLE newitems (
newitem_num INTEGER,
manucode CHAR(3) NOT NULL,

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 364
promotype INTEGER,
descrip CHAR(20));
当您定义 PRIMARY KEY 约束时,数据库服务器还静默地在同一列或在构成主
键的列集上创建了 NOT NULL 约束。
如果还指定了 NOT NULL 约束,则不能指定 NULL 作为列的显式缺省值。
如果在同一列上指定 NOT NULL 约束和 NULL 约束,则 CREATE TABLE 语
句发生错误并失败。
集合数据类型 LIST 、MULTISET 和 SET 的列要求 NOT NULL 约束。在结合
数据类型上不允许其它的列约束。
使用 NULL 约束
使用 NULL 关键字指定列可以存储其数据类型的 NULL 值。这意味着该列在插
入或更改操作期间不接受任何值。NULL 约束逻辑等价于从列定义中省略 NOT
NULL 约束。
以下示例创建 newitems 表。在 newitems 中,列 descrip 没有缺省值,但是它
允许 NULL 值。
CREATE TABLE newitems (
newitem_num INTEGER,
manucode CHAR(3) NOT NULL,
promotype INTEGER,
descrip CHAR(20) NULL);
在上述示例中,列 newitem_num 和 promotype 显式允许 NULL 值,因为它们
没有定义 NOT NULL 约束。
如果在同一列上指定 NOT NULL 约束和 NULL 约束,则 CREATE TABLE 语
句发生错误并失败。
不能在同一列上同时指定 NULL 约束和 PRIMARY KEY 约束,因为当
CREATE TABLE 语句定义 PRIMARY KEY 约束时,数据库服务器还静默地创建
了同一列或在构成主键的列集上创建了 NOT NULL 约束。
NULL 约束对于集合数据类型 LIST 、MULTISET 和 SET 的列无效,对
IDSSECURITYLABEL 列也无效。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 365
使用 UNIQUE 或 DISTINCT 约束
使用 UNIQUE 或 DISTINCT 关键字以要求某列或一组列的集合只接收唯一数据
值。如果列有唯一约束,则将不能把与其它行重复的值插入到该列中。当您创建
了 UNIQUE 或 DISTINCT 约束时,数据库服务器将自动在被约束的列上创建内
部索引。(在此上下文中,关键字 DISTINCT 是 UNIQUE 的同义词)。
不能在已经有主键约束的列上放置唯一约束。不能在 BYTE 或 TEXT 列上放置
唯一约束。
如先前所述,不能在 GBase 8s 的 BLOB 或 CLOB 列上放置唯一约束或主键约
束。
只有当辅助存取方法唯一支持不透明数据类型时,这种数据类型才支持唯一约
束。缺省的辅助存取方法是一种 B-tree ,它支持 equal( ) 操作符函数。因此,如
果不透明类型的定义包含 equal( ) 函数,则该不透明类型的列可以有唯一约束。
以下示例创建了一个简单表,该表在它的某一列上具有唯一约束:
CREATE TABLE accounts
(acc_name CHAR(12),
acc_num SERIAL UNIQUE CONSTRAINT acc_num);
有关约束名称的说明,请参阅声明约束名称 。
唯一约束和唯一索引的区别
尽管唯一索引和唯一约束的功能相似,除了在声明、更改或销毁它们的语法之间
的各种不同,还有在这两种的数据库对象之间的其它不同:

在 DDL 语句中,它们注册于或删除系统目录的不同表。

在 DML 语句中,在日志记录的表上启用唯一约束会在语句末尾被检
查,但是唯一索引是一行一行的检查,从而防止可能潜在地违反指定列
(或者对于多列列约束或索引是列列表)的唯一性的行的插入或更改。
例如,当您将值 1 、2 和 3 存储在具有 INT 列的日志记录表的行中,如果列 c
上有一个唯一索引,则对该表上指定的 SET c = c + 1 UPDATE 操作将发生错误
而失败,但是如果该列是具有一个唯一约束的话,该语句会成功。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 366
使用 PRIMARY KEY 约束
主键是表中每行都具有非 NULL 唯一值的列(或如果您使用多列约束格式时列的
集合)。当您定义了 PRIMARY KEY 约束时,数据库服务器将自动在组成主键
的列上创建内部索引,并静默地在同一列或列集合上创建 NOT NULL 约束。
只能为每个表指定一个主键。如果将单列定义为主键,则该列是唯一的。不能显
式地给相同的列指定唯一约束。
不能在 BLOB 或 CLOB 列上放置唯一约束或主键约束。
只有当辅助存取方法支持 GBase 8s 的不透明类型的唯一性时,这种类型才支持
主键约束。缺省辅助存取方法是一种 B-tree ,它支持 equal( ) 函数。因此,如果
不透明类型的定义包含 equal( ) 函数,该不透明的列可以有主键约束。
不能在 BYTE 或 TEXT 列上放置主键约束。
在前面两个示例中,在列 acc_num 上放置了唯一约束。以下示例将该列创建为
accounts 表的主键:
CREATE TABLE accounts
(acc_name CHAR(12),
acc_num SERIAL PRIMARY KEY CONSTRAINT acc_num);
REFERENCES 子句
使用 REFERENCES 子句建立引用关系:

表中(即在同一表的两列中间)

两个表之间(换句话说,创建一个外键)
REFERENCES 子句


GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 367
元素
描述
限制
语法
column 被引用列
请参阅 引用约束的限制
标识符
table
被参考表
必须与引用表驻留在相同的数据库中
标识符
引用列(定义的列)是对被引用的列或一组列的集合进行引用的列或一组列的集
合。引用列中可以包含 NULL 和重复值,但是被引用的列(或列的集合)中的值
必须是唯一的。
被引用列和引用列之间的关系被称为父 — 子关系,其中父亲是被引用的列(主
键),孩子是引用列(外键)。引用约束将建立这人父 — 子关系。
当您创建了引用约束后,数据库服务器将自动在受约束的列上创建内部索引。
引用约束的限制
您必须具有 References 特权来创建引用约束。
当您使用 REFERENCES 子句时,您必须注意下列限制:

被引用表和引用表必须在同一数据库中。

被引用列(当你使用多列约束格式时列的集合)必须具有唯一或主键约束

引用列和被引用列的数据类型必须相同。
唯一的例外是如果被参考列是 serial 数据类型,则参考列必须为整数数
据类型:
o
对于 BIGSERIAL 被引用的列,使用 BIGINT 引用列。
o
对于 SERIAL 被引用的列,使用 INT 引用列。
o
对于 SERIAL8 被引用列,使用 INT8 引用列。

不能在 RAW B 表的任何列上放置约束。

不能在 BYTE 、TEXT 、BLOB 或 CLOB 列上放置引用约束。

如果使用单列约束格式,您只能引用一列。

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

如果使用多列约束格式,则 REFERENCES 子句中列的最大数目是 16 ,
并且如果页大小为 2 千字节时,这些列的总长度不能超过 390 字节。
(最大长度随着页大小增加而增加。)
被引用列的缺省值
如果被引用表与引用表不同,则您不需要知道被引用列;缺省列为被引用表的主
键列(或列组)。如果被引用表与引用表一样,则必须指定被引用列。
表内的引用关系
可以在同一表的两列之间建立引用关系。在以下示例中, employee 表中的
emp_num 列通过雇员编号唯一地标识了每个雇员。该表中的 mgr_num 列包含管
理该雇员的经理的编号。在该示例中,mgr_num 将引用 emp_num 。在
mgr_num 列中出现重复的值,这是因为经理可以管理多个雇员。
CREATE TABLE employee
(
emp_num INTEGER PRIMARY KEY,
mgr_num INTEGER REFERENCES employee (emp_num)
);
其中行之间存在引用关系的表可以具有没有显式外键的 PRIMARY KEY 约束。
有关递归查询其中行存在逻辑层次结构的多个级别的表的语法。请参阅 层级查询
子句 。
创建引用约束时的锁定问题
当您创建引用约束时,将在被引用的表上放置互斥锁。当 CREATE TABLE 语句
完成时,该锁才被释放。如果在支持事务记录的数据库中创建表并使用事务,则
直到事务结束时锁才被释放。
使用单列约束格式的示例
这些示例指示了单列约束格式选项来定义缺省启用的外键约束,并声明禁用的引
用约束的名称。
缺省启用的引用约束

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 369
以下示例使用单列约束格式定义 sub_accounts 和 accounts 表之间的引用关系。
(术语外键约束和引用约束是同义词)。sub_accounts 表的 ref_num 列(外键)
引用了 accounts 表中的 acc_num 列(外键)。
CREATE TABLE accounts (
acc_num INTEGER PRIMARY KEY,
acc_type INTEGER,
acc_descr CHAR(20));
CREATE TABLE sub_accounts (
sub_acc INTEGER PRIMARY KEY,
ref_num INTEGER REFERENCES accounts (acc_num),
sub_descr CHAR(20));
以上定义 sub_accounts 表的 CREATE TABLE 语句的单列格式约束语法没有显式
指定 ref_num 列是外键,但是REFERENCES 关键字指定 ref_num 必须具有与
accounts 表中 acc_num 列的一些行的值相同的值。这意味着在 sub_accounts 是
引用表,accounts 是被引用表的引用关系中,ref_num 列是外键。
在单列约束格式中,您不能显式指定 ref_num 列为外键。当在引用表的单列(或
引用同一主键的列列表)上放置引用约束时,要包含 FOREIGN KEY 关键字,您
必须代替使用多列约束格式语法来定义引用约束。
缺省情况下,sub_accounts 表上的约束不用过滤而启用,因为没有指定显式约束
方式。可以使用 DISABLED 或 FILTERING 关键字在此示例中指定。SET
Database Object Mode 语句的 SET CONSTRAINTS 选项可以重置现有约束的对象
方式。
因为以上的 sub_accounts 示例没有为引用约束声明名称,所以数据库服务器在将
此约束注册到 sysconstraints 系统目录表中时隐式生成标识符,并将它的方式
( E )注册到 sysobjstate 系统目录表中。
禁用的引用约束
以下 CREATE TABLE 引用创建了 xeno_counts 表,并在它的 xeno_num 列和第
一个示例中 accounts 表的 acc_num 列之间定义了引用约束。此单列约束格式语
法还包含了约束定义,指定 DISABLED 作为它的约束方式,且声明 xeno_constr
作为外键约束的名称。此处 xeno_accounts 是引用表,accounts 是被引用表。
CREATE TABLE xeno_counts (

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 370
xeno_acc INTEGER PRIMARY KEY,
xeno_num INTEGER REFERENCES accounts (acc_num)
CONSTRAINT xeno_constr DISABLED,
xeno_descr CHAR(20));
在 DISABLED 方式,当 DML 操作在 xeno_counts 表中产生违例行时,不会执
行 xeno_constr 约束。然而,要实现参照完整性,可以使 SET Database Object
Mode 语句的 SET CONSTRAINTS 选项将约束的方式更改为 ENABLED。或者,
START VIOLATION 语句将违例表与 xeno_counts 表关联后, SET
CONSTRAINTS 可将 xeno_constr 约束重设为 FILTERING 方式。
使用 ON DELETE CASCADE 选项
使用 ON DELETE CASCADE 选项来指定从父表中删除某行时,是否需要从子表
中删除相应的行。如果您不指定级联删除,则数据库服务器的缺省行为将阻止您
删除表中的数据(如果有其它表引用它)。
如果指定此选项,则稍后当您删除父表中的行时,数据库服务器还删除任何与子
表中的行(外键)相关的行。级联删除功能最主要的好处是,需要执行删除操作
时它可以减少 SQL 语句的数量。
例如,all_candy 表中包含的 candy_num 列是主键。hard_candy 表将
candy_num 列作为外键引用。以下的 CREATE TABLE 语句将创建 hard_candy
表,其外键上具有级联删除选项:
CREATE TABLE all_candy
(candy_num SERIAL PRIMARY KEY,
candy_maker CHAR(25));

CREATE TABLE hard_candy
(candy_num INT,
candy_flavor CHAR(20),
FOREIGN KEY (candy_num) REFERENCES all_candy
ON DELETE CASCADE);
由于为子表指定了 ON DELETE CASCADE ,因此当从 all_candy 表中删除某行
时,hard_candy 表中的相应行也将被删除。有关从具有级联删除的表中删除行时
的语法限制和锁定影响的信息,请参阅级联删除表时的注意事项。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 371
CHECK 子句
使用 CHECK 子句来指定在 INSERT 或 UPDATE 语句中为某列指定数据之前
应满足的条件。
CHECK 子句

该条件不能包含用户定义的例程。
在插入或更新期间,如果某行的检查约束等于 false ,则数据库服务器将返回错
误。如果对某行进行检查约束时的值等于 NULL ,数据库服务器将不会返回错
误。在某些情况下,您可能希望同时使用检查约束和 NOT NULL 约束。
使用搜索条件
定义了检查约束的搜索条件不能包含以下元素:用户定义的例程、子查询、聚
集、主变量或行标识。此外,搜素条件还不能包含以下内部函数:CURRENT 、
SYSDATE 、USER 、CURRENT_USER 、SITENAME 、 DBSERVERNAME
或 TODAY 。
当您在搜素条件中指定日期值时,确保为年指定了四位数,这样 DBCENTURY
环境变量就不会影响条件。当您指定了 2 位数的年份时,如果条件取决于缩写形
式的年份值,则 DBCENTURY 环境变量将产生不可预料的结果。有关
DBCENTURY 的更多信息,请参阅 GBase 8s SQL 参考指南。
更多情况下,数据库服务器从检查约束创建时就开始保留这些环境变量的设置。
如果这些设置中的任意一个发生了更改,并且此更改将影响检查约束中对条件的
求值,则对条件进行求值时将忽视新设置,使用最初的环境变量设置。
对于 BYTE 或 TEXT 列,可以检查是否有 NULL 或 not-NULL 值。该约束是
BYTE 或 TEXT 列上的唯一约束。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 372
使用单列约束格式时的限制
当使用单列约束格式定义检查约束时,该检查约束无法依赖表中其它列的值。以
下示例将创建有两列具有检查约束的 my_accounts 表,每个约束都是单列约束格
式:
CREATE TABLE my_accounts (
chk_id SERIAL PRIMARY KEY,
acct1 MONEY CHECK (acct1 BETWEEN 0 AND 99999),
acct2 MONEY CHECK (acct2 BETWEEN 0 AND 99999));
acct1 和 acct2 都是 MONEY 数据类型的列,其值必须在 0 到 99999 之间。
然而,如果您想测试 acct1 的余额是否比 acct2 多,则不能使用单列约束格式。
如果要创建在多列中检查值的约束,则必须使用多列约束格式。
约束定义
使用 CREATE TABLE 的约束定义部分,是为了:

为约束声明一个名称

将约束设置为禁用的、启用的或过滤方式。
约束定义

元素
描述
限制
语法
constraint 约束的名称 必须在索引和约束名称中
是唯一的
标识符

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 373
声明约束名称
数据库服务器将约束作为索引实现。每次使用单列或多列约束格式在列上放置数
据约束,但没有声明约束名称时,数据库服务器将创建一个约束并在
sysconstraints 系统目录表中为该约束添加一行。
数据库服务器还生成一个标识符并在 sysindices 系统目录表中为不与已有约束共
享索引的每个新主键、唯一或引用约束添加一行。即使为约束声明了一个名称,
数据库服务器也会生成一个名称并出现 sysindices 表中。(该系统目录表还包含
sysindices 表上的视图,称为 sysindexes ,列出了复合索引的每个组件。)
如果愿意的话,您还可以为该约束指定一个有意义的名称。在数据库中的约束和
索引的名称中,该名称必须是唯一的。
如果约束违例则约束名称将出现错误消息中。当您使用 ALTER TABLE 语句的
DROP CONSTRAINT 子句时可以使用该名称。
当您使用 SET Database Object Mode 语句或 SET Transaction Mode 语句更改约束
方式时也可以指定约束名称以及在 DROP INDEX 语句中约束作为用用户定义名
称的索引实现 。
在兼容 ANSI 的数据库中,当声明任何类型约束名称时,在数据库内所有者名称
和约束名称的组合必须是唯一的。
数据库服务器生成的约束名称
如果未指定约束名称,数据库服务器将使用以下模板生成一个约束名称:
_
模板中,constraint_type 是字母 u 时标识唯一约束或主键约束,r 表示引用约
束,c 表示检查约束,n 表示 NOT NULL 约束。模板中,tabid 和 constraintid
分别来自 systables 和 sysconstraints 系统目录表的 tabid 和 constrid 列的值。
例如,唯一约束的约束名称可能看起来像” u111_14”前面有一个空格)。
如果生成的名称与已有的名称冲突,则数据库服务器将返回一个错误并且您必须
提供一个显式的约束名称。
sysindexes(或 sysindices)中生成的索引名称具有以下格式:

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 374
[blankspace]_
例如,索引名称类似于“ 111_14 “(这里是有引号显示空白的位置)。
选择约束方式选项
使用约束方式(ENABLED 、DISABLED 和 FILTERING)选项来控制
INSERT 、DELETE 、MERGE 和 UPDATE 操作中约束的行为。
对于 CREATE TABLE 语句定义的约束,这些是可选的。
方式 作用
DISABLED 不要在 INSERT 、DELETE 和 UPDATE 操作期间强制约束
ENABLED 在 INSERT 、DELETE 和 UPDATE 操作时强制使用约束。
如果目标行引起约束违例,则该语句失败。该方式是缺省值。
FILTERING 如果 START VIOLATIONS 语句创建了违例表和诊断表,在
INSERT 、DELETE 和 UPDATE 操作时强制使用约束。如果
目标行引起约束违例,则该语句继续进行。数据库服务器将有
问题的行写到与目标关联的违例表中,并将诊断信息写到关联
的诊断表中。
如果选择过滤方式,则可以指定 WITHOUT ERROR 或 WITH ERROR 选项。以
下列表将说明这些 ERROR 选项。
错误选项 作用
WITH ERROR 在 INSERT 、DELETE 和 UPDATE 操作期间,如果违反
过滤方式约束将返回违反完整性的错误。
WITHOUT ERROR 在 INSERT 、DELETE 和 UPDATE 操作期间,如果违反
过滤方式约束将不返回违反完整性的错误。这是缺省错误选
项。
注:

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 375
要使 FILTERING WITHOUT ERROR 方式具有这些作用,您还必须使用 START
VIOLATIONS TABLE 语句为定义约束的目标表启动违例表和诊断表。您可以发
出这些语句

在您设置表的任何约束为过滤方式之前,

或在您将约束设置成过滤方式后,但在任何用户在对表中的行执行
INSERT、DELETE 或 UPDATE 操作之前。
约束方式注册在 sysobjstate 系统目录表中。
外键约束的 NOVALIDATE 方式
以上列出的方式只是 SET Database Object Mode 语句的 SET CONSTRAINTS 选
项在其重置现有外键约束方式时可以指定的约束方式的一个子集。它们还是
ALTER TABLE ADD CONSTRAINT 语句在现有表上创建新的外键约束时能指定
的约束方式的子集。
ALTER TABLE ADD CONSTRAINT 和 SET CONSTRAINTS 语句可在约束定义
中包含 NOVALIDATE 关键字来指定这些额外外键约束方式中的一种方式。其效
果是当创建或启用外键约束时,数据库服务器跳过对违例的现有行的检查,从而
减少了处理 DDL 语句所需的时间和资源。然而,当语句执行完毕后,每个
NOVALIDATE 方式自动还原成 ENABLED 或 FILTERING 方式。因此,
NOVALIDATE 关键字无法阻止随后表的 DML 操作的参照完整性的强制执行,因
为 NOVALIDATE 关键字不能持续超越定义它们的 DDL 语句。
由于大多数表在它们创建后都是空表,因此对现有行的参照完整性检查一般不会
在建立表时发生,而且 CREATE TABLE 语句不支持 NOVALIDATE 约束方
式。然而,在有外键约束的非空表需要被移动到另一个数据库或数据仓库中的上
下文中,这些方式是很有效率的。
多列约束格式
使用多列约束格式将单列或多列与约束关联起来。这种单列约束格式的备用方法
允许您将多列与一个约束关联起来。
多列约束格式

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

元素
描述
限制
语法
column 要放置约束的列
不能是 BYTE 、TEXT 、
BLOB 、CLOB
标识符
多列约束具有这些基数和大小限制:

指定的列的名称不能超过 16 个。

在 GBase 8s 中,列列表的最大总长度依赖于页大小,其计算公式为:
MAXLength = (((PageSize - 93)/5) -1)
o
对于 2K 的页大小,总长度不能超过 390 字节。
o
对于16K 的页大小,总长度不能超过 3257 字节。
此处的反斜杠(/)符号代表整除。
当您定义唯一约束时(通过使用 UNIQUE 或 DISTINCT 关键字),列在约束列
表中只能出现一次。
使用多列约束格式,您可以完成以下任务:

为一组一列或多列的集合创建数据完整性约束

为约束指定助记符名称

指定在插入、删除和更新操作期间控制约束行为的约束方式选项。
当您使用此格式时,可以创建主键和外键的组合,或者定义能比较不同列中数据
的检查约束。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 377
另见 唯一约束和唯一索引的区别 章节。
使用多列格式约束的限制
使用多列约束格式时,不能为这些列定义缺省值。此外,不能在同一张表的两列
之间建立参考引用关系。
要定义列的缺省值或者建立同一张表中两列之间的引用关系,请分别参考单列约
束格式和表内的引用关系。
在约束中使用大对象类型
不能在 BYTE 或 TEXT 列上放置唯一、主键或引用(FOREIGN KEY)约束。
但是可以使用检查约束来检查 NULL 或 non-NULL 值。
不能在 BLOB 或 CLOB 列上放置唯一或主键约束。如果约束是在包含存储了加
密数据的列的列集合上,则 GBase 8s 无法强制执行此约束。
您可以在以下各节中找到对特定约束的详细讨论:
约束
有关更多信息,请参阅
有关示例,请参阅
CHECK
CHECK 子句
在多个列上定义检查约束
DISTINCT
使用 UNIQUE 或 DISTINCT 约束
多列约束格式的示例
FOREIGN KEY
使用 FOREIGN KEY 约束
定义组合的主键和外键
PRIMARY KEY
使用 PRIMARY KEY 约束
定义组合的主键和外键
UNIQUE
使用 UNIQUE 或 DISTINCT 约束
多列约束格式的示例
使用 FOREIGN KEY 约束
外键连接并建立表之间的相关性。即,创建了一个引用约束。(有关引用约束的
更多信息,请参阅 REFERENCES 子句。)
外键将引用表中唯一键或主键。对于外键列中的每个条目,如果所有的外键列都
包含 non-NULL 值,则匹配的条目必须存在于唯一或主键列中。
不能将 BYTE 或 TEXT 列指定为外键。
不能将 BLOB 或 CLOB 列指定为外键。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 378
多列约束格式的示例
以下示例创建了一个名为 order_items 的标准表,它有一个使用多列约束格式的
名为 items_constr 的唯一约束:
CREATE TABLE order_items
(
order_id SERIAL,
line_item_id INT not null,
unit_price DECIMAL(6,2),
quantity INT,
UNIQUE (order_id,line_item_id) CONSTRAINT items_constr
);
有关约束名称的信息,请参阅声明约束名称。
在多个列上定义检查约束
当您使用多列约束格式定义检查约束时,检查约束可以应用于相同表的多列。
(但是,不能创建其 condition 使用来自其它表中某列的值的检查约束。)
该示例比较了新表中的两列,acct1 和 acct2:
CREATE TABLE my_accounts
(
chk_id SERIAL PRIMARY KEY,
acct1 MONEY,
acct2 MONEY,
CHECK (0 < acct1 AND acct1 < 99999),
CHECK (0 < acct2 AND acct2 < 99999),
CHECK (acct1 > acct2)
);
在此示例中,列 acct1 必须比大于列 acct2 ,否则插入或更改会失败。
定义组合的主键和外键
当您使用多列约束格式时,可以创建一个组合关键字。组合关键字指定多列的主
键或外键约束。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 379
以下示例创建两个表。第一个表的组合关键字表现为主键。第二表的组合关键字
表现为外键。
CREATE TABLE accounts (
acc_num INTEGER,
acc_type INTEGER,
acc_descr CHAR(20),
PRIMARY KEY (acc_num, acc_type));

CREATE TABLE sub_accounts (
sub_acc INTEGER PRIMARY KEY,
ref_num INTEGER NOT NULL,
ref_type INTEGER NOT NULL,
sub_descr CHAR(20),
FOREIGN KEY (ref_num, ref_type) REFERENCES accounts
(acc_num, acc_type));
在此示例中,sub_accounts 表的外键 ref_num 和 ref_type,引用 accounts 表中
的组合关键字 acc_num 和 acc_type。如果在插入和更新期间,当您试图向
sub_accounts 表中插入一行,而其中 ref_num 和 ref_type 的值没有精确地与
accounts 表中已有行的 acc_num 和 acc_type 的值对应,则数据库服务器将返
回一个错误。
在引用和被引用的列之间,引用约束必须具有一对一的关系。换句话说,如果组
合关键字是一组列的结合(组合关键字),则外键也必须是与组合关键字对应的
一组列的集合。
由于数据库服务器的缺省行为。因此当您创建外键引用时,并不需要显式地引用
组合关键字(acc_num 和 acc_type)。可以如下重写前面示例的引用部分:
FOREIGN KEY (ref_num, ref_type) REFERENCES accounts
约束缺省的索引创建策略
当您创建带有唯一或主键约束的表时,数据库服务器为每一个约束创建一个唯一
并升序的内部索引。
当创建带有引用约束的表时,数据库服务器创建一个升序的内部索引,它允许引
用约束中您指定的每一列有重复的值。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 380
内部索引占据与其表相同的存储位置。对于已分片的表,内部索引的分片占据与
您为此表分片指定的相同的 dbspace 分区(或者在某些情况下,为数据库
dbspace)。
如果您需要索引分片策略独立于底层表分片,则创建该表时不要定义此约束。而
使用 CREATE INDEX 语句创建具有期望分片存储策略的唯一索引。然后使用
ALTER TABLE 语句添加约束。新的约束使用先前定义的索引。
重要: 在非日志记录的数据库中,detached checking 是唯一可用的约束检查。
已拆离检查意味着一行一行地进行约束检查。
Options 子句
CREATE TABLE 语句的 Options 子句提供创建各类隐藏列的选项。支持行级别
审计、基于标签的安全策略、存储位置、分布存储策略、页扩展大小、锁定粒
度、用户定义的存取方法和可影响列分布统计信息集合的属性。
Options

表选项的顺序
此语法图显示了包含多个下列选项的 CREATE TABLE 语句中表选项的顺序:

WITH 选项

SECURITY POLICY 选项

存储选项

LOCK MODE 选项

USING Access-Method 子句

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

统计信息选项。
如果您包含了多个 WITH 选项,则在连续的 WITH 选项之间需要逗号分隔符
(,)。
有关在分片表的行中使用 WITH ROWIDS 选项的信息,请参阅使用 WITH
ROWIDS 选项。
同一 CREATE TABLE 语句中的多个 WITH 选项不要求先后顺序,但是您包含
的所有的 WITH 选项必须在上述列表中的任何其它五个表选项之前。
例如,下列两个 CREATE TABLE 语句是等价的:
CREATE STANDARD TABLE IF NOT EXISTS myShadowy_tab(colA INT, colB
CHAR)
WITH ERRKEY, WITH CRCOLS, WITH AUDIT LOCK MODE ROW;

CREATE STANDARD TABLE IF NOT EXISTS myShadowy_tab(colA INT, colB
CHAR)
WITH AUDIT, WITH ERRKEY, WITH CRCOLS LOCK MODE ROW;
如果您在相同的数据库中连续发出这些语句,则第二条语句失败,因为第一条语
句创建的名为 myShadowy_tab 的表已经在数据库中存在。由于 IF NOT EXISTS
关键字,冗余的第二条语句不会返回错误,但是它不会创建新表。
以下示例发生错误而失败,因为其它 Options 子句不能在 WITH 子句前面:
CREATE TABLE shadow_columns (colA INT, colB CHAR)
LOCK MODE ROW WITH AUDIT, WITH ERRKEY, WITH CRCOLS;
--bad options order
下一个 CREATE TABLE 示例也失败,因为在同一 Options 子句中 Statistics 选
项不能在 LOCK MODE 选项前面:
CREATE TABLE shadow_columns (colA INT, colB CHAR)
STATCHANGE 25 STATLEVEL TABLE LOCK MODE PAGE; --bad options
order
重要: 您不能使用 CREATE TABLE 语句的 Options 子句在已经存在的表结构
中添加新的隐藏列或做其它更改。要做更改,例如,当创建现有表时,Options 子

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 382
句包含或忽略 WITH 关键字,使用 ALTER TABLE ADD 或 ALTER TABLE
DROP 语句的适当的选项。有关更多信息,请参阅ALTER TABLE 语句。
使用 WITH AUDIT 子句
使用 WITH AUDIT 关键字创建表,如果启用了选择性行级别,则该表将包含在
行级别升级的表的集合中。
如果创建带有 WITH AUDIT 子句的表,则当选择性行级别审计启动时,表中行
级别审计事件会重新排序。在本表上应用 WITH AUDIT 属性不会启用选择性行
级别审计。此审计类型在使用 onaudit -R 命令将 adtcfg 文件的 ADTROWS 参数
设置成 1 或 2 时启用。
您必须具有 RESOURCE 或 DBA 权限才能运行带有 WITH AUDIT 子句的
CREATE TABLE 语句。
使用 WITH CRCOLS 选项
使用 WITH CRCOLS 关键字创建两个影子列,Enterprise Replication 将它们用于
冲突解决。第一列 cdrserver 中包含最近发生修改的数据库服务器的标识。第二
列 cdrtime 中包含最近一次修改的时间戳记。必须在您可以使用时间戳记或
UDR 冲突解决之前添加这两列。这两列是隐藏的影子列,因为它们不能被索引且
不能在系统目录表中查看。
对于大多数数据库操作,cdrserver 和 cdrtime 列都是隐藏的。例如,如果您在
创建表时包含了 WITH CRCOLS 关键字,则 cdrserver 和 cdrtime 列将有以下的
行为:

当查询时指定星号(*)作为投影列表时(如下列语句所示),它们不会
返回:
SELECT * FROM tablename;

当您询问有关表中列的信息时,它们并不出现在 DB-Access 中。

它们并不包含在 tablename 的 systables 系统目录表条目的列数目
(ncols)中。
要查看 cdrserver 和 cdrtime 的内容,请在 SELECT 语句的投影列表中显式指
定这些列,如以下示例所示:
SELECT cdrserver, cdrtime FROM tablename;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 383
有关如何使用这些选项的更多信息,请参阅 GBase 8s Enterprise Replication 指
南。
使用 WITH ERKEY 关键字
使用 WITH ERKEY 关键字创建 ERKEY 影子列,它可以被 Enterprise
Replication 用作复制键。
ERKEY 影子列(ifx_erkey_1 、ifx_erkey_2 和 ifx_erkey_3)是可见的影子列,因
为它们可以被索引且能在系统目录表中查看。在创建 ERKEY 影子列之后,会在
使用这些列的表上创建新的唯一索引和唯一约束。Enterprise Replication 使用此索
引作为复制键。
对于大多数数据库操作,ERKEY 列是隐藏的。例如,如果您在创建表时包含了
WITH ERKEY 关键字,则 ERKEY 列具有以下行为:

当查询时指定星号(*)作为投影列表时(如下列语句所示),它们不会
返回:
SELECT * FROM tablename;

当您询问有关表中列的信息时,它们并不出现在 DB-Access 中。

它们并不包含在 tablename 的 systables 系统目录表条目的列数目
(ncols)中。
要查看 ERKEY 列的内容,请在 SELECT 语句的投影列表中显式指定这些列,
如以下示例所示:
SELECT ifx_erkey_1, ifx_erkey_2, ifx_erkey_3 FROM customer;
示例
在以下示例中,ERKEY 影子列添加到 customer 表中:
CREATE TABLE customer (id INT) WITH ERKEY;
使用 WITH REPLCHECK 关键字
使用 WITH REPLCHECK 关键字创建 ifx_replcheck 影子列,Enterprise
Replication 将该列用于一致性检查。
ifx_replcheck 列是可见的影子列,因为它们可以被索引且能在系统目录表中查
看。创建 ifx_replcheck 影子列之后,必须在主键和 ifx_replcheck 列上创建唯一

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 384
索引。ifx_replcheck 影子列必须是该索引中的最后一列。Enterprise Replication 使
用此索引加速一致性检查。
对于大多数数据库操作,ifx_replcheck 列是隐藏的。例如,如果创建表时使用
了 WITH REPLCHECK 关键字,则 ifx_replcheck 列包含以下行为:

当查询时指定星号(*)作为投影列表时(如下列语句所示),它们不会
返回:
SELECT * FROM tablename;

当您询问有关表中列的信息时,它们并不出现在 DB-Access 中。

它们并不包含在 tablename 的 systables 系统目录表条目的列数目
(ncols)中。
要查看 ifx_replcheck 列的内容,请在 SELECT 语句的投影列表中显式指定这
些列,如以下示例所示:
SELECT ifx_replcheck FROM customer;
示例
在下列示例中,将 ifx_replcheck 影子列添加到 customer 表中:
CREATE TABLE customer (id int) WITH REPLCHECK;
使用 WITH VERCOLS 选项
使用 WITH VERCOLS 关键字创建两个影子列, GBase 8s 使用它们来支持辅助
服务器上的更改操作。
第一列 ifx_insert_checksum 中包含首次创建时的行的校验和。第二列
ifx_row_version 中包含行的版本号。当行第一次插入时,生成
ifx_insert_checksum ,且 ifx_row_version 将设置为 1 。每当行更新时,
ifx_row_version 加一,但 ifx_insert_checksum 不会更改。这两列是可见的影子
列,因为它们可以被索引且能在系统目录表中查看。
对于大多数数据库操作,ifx_insert_checksum 和 ifx_row_version 列是隐藏
的。例如,如果您创建表时包含了 WITH VERCOLS 关键字,则
ifx_insert_checksum 和 ifx_row_version 列具有以下行为:

当查询时指定星号(*)作为投影列表时(如下列语句所示),它们不会
返回:

SELECT * FROM tablename;

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

当您询问有关表中列的信息时,它们并不出现在 DB-Access 中。

它们并不包含在 tablename 的 systables 系统目录表条目的列数目
(ncols)中。
要查看 ifx_insert_checksum 和 ifx_row_version 列的内容,请在 SELECT
语句的投影列表中显式指定这些列,如以下示例所示:
SELECT ifx_insert_checksum, ifx_row_version FROM tablename;
当启用了行版本化时,则 ifx_row_version 在行每更新一次时增加一;但是
Enterprise Replication 做出的行更改不会增加行的版本。要在使用 Enterprise
Replication 的服务器上更改行的版本,必须在复制参与者定义中包含
ifx_row_version 列。
有关如何使用此选项的更多信息,请参阅 GBase 8s 管理员指南 。
SECURITY POLICY 子句
该可选的 Security Policy 子句可使用以下语法来指定与表相关联的安全策略。
SECURITY POLICY Clause

元素
描述
限制
语法
policy 安全策略的名称
在数据库中必须存在
标识符
只有 DBSECADM 才能创建包含 Security Policy 子句的表,该子句为此表指定安
全策略。
以下准则适用于可通过 CREATE TABLE 语句中包含有效的 SECURITY POLICY 子句
来保护的表:

除非表具有与自己相关联的安全策略,且有行被保护或至少有一列被保
护,那么该表是受保护的表,否则它没有被保护。前一种情况指示该表是
具有行级粒度保护的表,后一种情况指示表是具有列级粒度保护的表。

如果该表不具备与其相关联的安全策略,则使用 IDSSECURITYLABEL
列子句保护列失败。

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

如果该表不具备与其相关联的安全策略,则使用 COLUMN SECURED
WITH 列子句保护列失败。

一个表最多只能有一个安全策略。

一个表可具有任何数量的被保护列,且每个被保护列可具有不同的标签,
或者一些被保护的列可以共享相同的标签。

安全策略不能与临时表或在表层次结构中的类型表相关联。
CREATE TABLE 语句的 Statistics 选项
使用 CREATE TABLE 语句的 Statistics 选项子句设置已分片表或未分片表的
STATCHANGE 属性的值,和已分片表的 STATLEVEL 属性。
语法
这些表属性控制自动重新计算(STATCHANGE)的阈值和数据分布统计信息的粒
度(STATLEVEL)。

元素
描述
限制
语法
change_
threshold
定义过时分布统计信息
的已更改数据的百分比
必须是 0 - 100 之间的
整数
精确数值
用法
Statistics 选项子句可定义在 SQL 语句以 LOW 、MEDIUM 或 HIGH 方式运行
下,允许用户控制 UPDATE STATISTICS 行动的表统计信息属性。
Statistics 选项子句可以设置的两个表属性为 STATCHANGE 和 STATLEVEL :
STATCHANGE 表属性指定需要考虑统计信息过时的变更(来自自上次重新计算
分布统计信息表中或分片中对行的 UPDATE \DELETE \MERGE 和 INSERT 操
作)的最小百分比。可以指定 0 - 100 范围内的整数或者使用 AUTO 关键字将

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 387
ONCONFIG 文件中或会话环境中当前的 STATCHANGE 配置参数作为缺省更改
的阈值。
选择性更新表和分片统计信息的自动方式可通过以下任意方法启用:

将 AUTO_STAT_MODE 配置参数设置成 1 (或者不设置)。系统缺省
启用自动方式。

将 AUTO_STAT_MODE 会话环境变量设置成 "ON"。在当前会话期间
启用自动方式。

UPDATE STATISTICS 语句包含 AUTO 关键字。当当前数据库运行时启
用自动方式。
当启用自动方式时,UPDATE STATISTICS 语句使用显式或缺省的
STATCHANGE 值来标识统计信息丢失或过时的表、索引或分布,以及只是统计
信息丢失或过时的更改。有关 UPDATE STATISTICS 操作的自动方式的更多信
息,请参阅 GBase 8s 管理员参考中关于 AUTO_STAT_MODE 配置参数的描
述。另见 AUTO_STAT_MODE 环境选项 和 使用 FORCE 和 AUTO 关键字.
分片表的 STATLEVEL 属性可以决定它的数据分布和索引统计信息的粒度级别。如
果在创建时没有指定任何值,则它可以是以下三个值的其中之一(AUTO 是缺省
的):

TABLE 指定为表创建的所有的分布都是表级别的。

FRAGMENT 指示按每一个分片创建和维护分布。

AUTO 指定数据库服务器在运行时应用标准以确定分片级分布是否必
要。这些标准要求以下所有的条件都为真:
o
SYSSBSPACENAME 配置参数设置指定了现有 sbspace 。
o
该表按 EXPRESSION 、INTERVAL 或 LIST 策略分片。
o
该表拥有超过百万条的行。
如果任何这些标准都不满足,则数据库服务器创建表级别分布,而非分片
级分布。
这些属性总是应用。如果 STATLEVEL 设置是 AUTO ,则该设置重写缺省值。
注: SYSSBSPACENAME 配置参数(在数据库例程初始化时必须设置)指定数据库
服务器存储分片级数据分布统计信息的 sbspace 。这些统计信息作为 BLOB 对象

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 388
存储在 syfragsdist 系统目录表的 encdist 列中。对于支持分片级统计信息的
数据库服务器,SYSSBSPACENAME 配置参数设置指定现有 sbspace 。
如果您使用 Statistics 选项子句将 STATLEVEL 属性设置为 FRAGMENT,则当
以下任一条件为真时,数据库服务器返回错误:

没有设置 SYSSBSPACENAME 配置参数。

SYSSBSPACENAME 指定的 sbspace 没有合适地按 onspaces -c -S 命令
分配。
存储选项
使用 CREATE TABLE 语句的 FRAGMENT BY 子句、PUT 子句、EXTENT 大
小选项和 COMPRESSED 选项指定存储位置、分布方案、表的 extent 大小以及
该表的大量新的数据行是否启用自动压缩。
Storage 选项

元素
描述
限制
语法
dbspace 存储表的 Dbspace
必须存在
标识符
extspace 在 onspaces 命令中声明的名
称,指的是数据库服务器之外
的存储区域
必须存在
请参阅文档以了解
您使用的存取方法
用法
为该表指的位置、分布方案和 extent 大小的存储选项是 SQL 语法 ANSI/ISO 标
准的扩展。
如果使用 USING 存取方法子句来指定存取方法,则该方法必须支持存储空间。
您可以为表指定一个不同于数据库存储位置的 dbspace,或将表在多个 dbspace
之间分片,或在一个或多个 dbspace 的多个分区之间分片。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 389
如果没有指定 IN 子句也没有指定分片方案,则新表将驻留在当前表所在的同一
个 dbspace 中。但是,如果您启用了自动定位和分片,则表在被服务器选定的
dbspace 中创建和分片。要启用表的自动定位和分片功能,请将 AUTOLOCATE
配置参数或会话环境变量设置为正整数。该整数值代表初始分配给该表的分片数
量。其它的分片随着表的增长而添加。
在 GBase 8s 中,您可以使用 PUT 子句为智能大对象指定存储选项。
注: 如果您的表包含简单对象(TEXT 或 BYTE),则可以为每个对象指定单独的
blobspace 。
使用 IN 子句
使用 IN 子句为该表指定存储空间。您指定的存储空间必须已经存在。
在 dbspace 中存储数据
可以使用 IN 子句来隔离表。例如,如果 history 数据库在 dbs1 dbspace 中,但
是您希望将 family 数据放在名为 famdata 的一个单独的 dbspace 中,请使用以
下语句:
CREATE DATABASE history IN dbs1;

CREATE TABLE family
(
id_num SERIAL(101) UNIQUE,
name CHAR(40),
nickname CHAR(20),
mother CHAR(40),
father CHAR(40)
)
IN famdata;
有关如何在不同的 dbspace 中存储和管理表的信息,请参阅 GBase 8s 管理员指
南 。
在 extspace 中存储数据
通常,将 extspace 存储选项与 USING 存取方法子句 一起使用。有关
更多信息,请参阅您使用的存取方法的文档。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 390
PUT 子句
使用 PUT 子句指定存储空间以及要包含智能大对象的每个列的特征。
PUT Clause

元素
描述
限制
语法
column
存储在 sbspace 中的

必须包含 BLOB 、CLOB 、用
户定义的或复杂数据类型
标识符
kilobytes
要为 extent 大小而
分配的千字节数
必须是整数值
精确数值
sbspace
智能大对象的存储区
域的名称
必须存在
标识符
指定的列不能是 column.field 格式。即,您所存储的智能大对象不能是 ROW 类
型的一个字段。
指定存储位置

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 391
每个智能大对象都存储在单独的 sbspace 中。除非 PUT 子句 指定了另外的区
域,否则 SBSPACENAME 配置参数指定在其中创建智能大对象的系统缺省值。
例如,以下示例创建只包含了 BLOB 数据类型列的 tabwblob 表。声明该列的名
称为 image01,且 PUT 子句指定所有的 BLOB 对象的存储位置为
sbspace01 :
CREATE TABLE tabwblob
(
image01 BLOB
) PUT image01 IN (sbspace01);
要使以上示例有效,则 sbspace01 必须已经存在。因为 PUT 子句没有指定其它
选项,所以 sbspace01 具有 extent 大小的缺省值和 PUT 子句能定义的其它存储
特征的缺省值,包括以下定义中的 NO LOG 、HIGH INTEG 和 NO KEEP
ACCESS TIME 。
PUT 子句可为 BLOB 和 CLOB 列列表指定存储位置。以下示例定义了 tabw2blobs
表,它有两个列,image02 列是 BLOB 类型,commentary03 列是 CLOB 类型。在
下一个示例中,PUT 子句指定了在这两个列中的所有的智能大对象都将存储在同
一智能大对象空间 sbspace01 中:
CREATE TABLE tabw2blobs
(
image02 BLOB,
commentary03 CLOB
) PUT image02 IN (sbspace01),
commentary03 IN (sbspace01);
可以在循环分布方案中指定多个 sbspace 来存储同一 BLOB 或 CLOB 列,这样
每个 sbspace 中的智能大对象旧大致相同。单个列的 sbspace 列表(按逗号分
隔)必须包含在括号内。
下一示例定义了 tabw2sblobs 表,它具有两列,image04 列是 BLOB 类型,
commentary05 列是 CLOB 类型。PUT 子句指定 image04 列中的 BLOB 对象
存储在两个 sbspace 中:sbspace01 和 sbspace02 ,而 image05 列中所有的
CLOB 对象存储在 sbspace03 sbspace 中:
CREATE TABLE tabw2sblobs
(

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 392
image04 BLOB,
commentary05 CLOB
) PUT image04 IN (sbspace01,sbspace02),
commentary05 IN (sbspace03);
如果 INSERT 或 MERGE 操作向此示例中的表中添加六个新的行,

三个 image04 BLOB 对象将存储于 sbspace01 ,

其它三个 image04 BLOB 对象将存储于 sbspace02 ,

所有的六个 commentary05 CLOB 对象将存储于 sbspace03 。
当您跨不同的 sbspace 传递智能大对象时,可以用较小的 sbspace 操作。如果限
制了 sbspace 的大小,则备份和归档操作会加快执行,有关 PUT 子句的其它示
例,请参阅完全备份的备用方式。
指定 sbspace 特征
以下存储选项可用于存储 BLOB 和 CLOB 数据:
选项 作用
EXTENT SIZE 指定智能大对象中能最少存储多少千字节。数据库服务
器可能将指定的 kilobytes 值集中起来,从而使范围是
sbspace 页面大小的若干倍。
HIGH INTEG 此高级数据完整性选项生成包含页眉和页尾的用户数据
页以检测不完整的写和数据损坏。这是缺省的数据完整
性行为。
MODERATE INTEG 此数据完整性选项生成包含页头但不包含页尾的用户数
据页面。该选项可将页头和页尾进行比较以检测不完整
的写和数据损坏。
KEEP ACCESS TIME 对于智能大对象元数据中的记录,智能大对象是最近一
次对其进行读或写操作的系统时间。
NO KEEP ACCESS TIME 不记录智能大对象最近一次进行读或写的系统时间。与
KEEP ACCESS TIME 选项相比,它能提供更好的性能
并且是缺省的跟踪行为。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 393
LOG 对于相应的智能大对象,与当前数据库日志一起记录日
志的过程。该选项将会生成大量的日志流量并增加填满
逻辑日志的风险。(另见 完全备份的备用方式。)
NO LOG 关闭日志记录。该选项是缺省行为。
定义 sbspace 特征的关键字选项的逗号分隔的列表必须包含在括号中内,且紧随
存储 BLOB 或 CLOB 列的 sbspace (或 sbspace 列表)的后面。在以下示例
中, PUT 子句指定未日志记录的 sbspace01 和 sbspace02 sbspaces 存储
image04 列的 BLOB 对象,它们与 sbspace03 具有不同的特征,sbspace03 是
一个日志记录的 sbspace ,它存储 commentary05 列的 CLOB 对象:
CREATE TABLE tabw2sblobs
(
image04 BLOB,
commentary05 CLOB
) PUT image04 IN (sbspace01,sbspace02) (KEEP ACCESS TIME,
MODERATE INTEG),
commentary05 IN (sbspace03) (EXTENT SIZE 30, LOG);
当您为智能大对象启动日志记录时,必须立即执行 0 级备份以便恢复并重新存储
智能大对象。
syscolattribs 系统目录表包含 PUT 子句中每个 sbspace 和 column 组合的
行:

syscolattribs.extentsize 列存储 extent 大小,它基于 kilobytes 值。

syscolattribs.flags 列存储关联到日志记录和存取时间状态的位图,和数
据完整性设置。
如果用户定义的或复杂数据类型包含多个大对象,则指定的大对象存储选项将应
用到该类型中的所有大对象。除非当大对象创建时重设了存储选项。
重要: PUT 子句不影响简单大对象数据类型(BYTE 和 TEXT)的存储。有关
如何存储 BYTE 和 TEXT 数据的信息,请参阅大对象数据类型。
完全备份的备用方式
您可以在最初开始加载智能大对象时关闭日志记录,一旦对象已经加载后就可以
返回日志记录,从而取代完全日志记录。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 394
使用 NO LOG 选项关闭日志记录。如果您使用 NO LOG ,可以稍后将智能大对
象元数据恢复到没有结构不一致存在的状态。在大多数情况下,不存在事务不一
致,但结构无法保证。
以下语句将创建 greek 表。表中的数据值被分片并保存到 dbs1 和 dbs2
dbspace 中。PUT 子句将 gamma 和 delta 列中的智能大对象数据分别指定给智
能大对象 sb1 和 sb2 sbspace。eps 列的 TEXT 数据值被指定给 blb1
blobspace 。
CREATE TABLE greek
(alpha INTEGER,
beta VARCHAR(150),
gamma CLOB,
delta BLOB,
eps TEXT IN blb1)
FRAGMENT BY EXPRESSION
alpha <= 5 IN dbs1, alpha > 5 IN dbs2
PUT gamma IN (sb1), delta IN (sb2);
FRAGMENT BY 子句
使用 FRAGMENT BY 子句创建分片表并指定它的存储分布方案。PARTITION
BY 关键字是 FRAGMENT BY 的同义词。
表的 FRAGMENT BY 子句


GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 395
元素
描述
限制
语法
column
应用分片存储策略的列
必须是表中的列
标识符
dbspace
存储表分片的 Dbspace
最多可以指定 2,048 个
dbspaces。所有存储分片的
dbspaces 必须具有相同的
页大小。
标识符
fragment
_key
表列上的强制转型、列或
函数表达式。这是在已分
片的表上的表达式。
列只能来源于当前表。
表达式
partition
此处为分片声明的名称
在该表的分片名称中必须是
唯一的
标识符
当您分片表时,存储表分片的存储空间名跟在 IN 关键字的后面。
使用 WITH ROWIDS 选项
未分片的表包含名为 rowid 的隐藏列,但是缺省情况下,分片表没有 rowid
列。可以使用 WITH ROWIDS 关键字向已分片表中添加 rowid 列。每行将自动
分配一个唯一的 rowid 值,该行存在时这个值将一直保持不变,这样数据库服务
器就可以使用该值来查找行的物理位置。每行需要额外的四个字节来存储
rowid 。
重要: 不推荐使用此功能。请使用主键作为存取方法,而不要使用 rowid 列。
无法对类型表使用 WITH ROWIDS 子句。
通过 ROUND ROBIN 分片
在循环分布方案中,至少指定两个您希望放置分片的 dbspace 或分区。当记录被
插入表中时,它们被放置在第一个可用的分片中。当您插入记录并按照分片总是
保持大致相同的行数的方式分布行时,数据库服务器将在指定的分片中平衡负
载。在该分布方案中,如果数据库服务器查找某行则它必须扫描所有的分片。
重要:

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 396
FRAGMENT BY ROUND ROBIN 子句重写表的自动定位和分片,当
AUTOLOCATE 配置参数或 AUTOLOCATE 环境变量设置成正整数时,启用此
功能。
当启用自动定位和分片时,则数据库服务器会自动决定

表 extent 大小,

存储分片的 dbspaces ,

新表的 ROUND ROBIN 分布存储策略。
大对象数据类型的循环分片存储
对于包含 BYTE 或 TEXT 列的表中的简单大对象,您可以通过设置
PN_STAGEBLOB_THRESHOLD 配置参数来为插入 BYTE 和 TEXT 列保留空
间。有关数据库服务器如何在循环分布分片中 stage 简单大对象的信息,请参阅
GBase 8s 管理员参考手册 中 PN_STAGEBLOB_THRESHOLD 的描述。
对于包含 BLOB 或 CLOB 列的表中的智能大对象,您可使用 PUT 子句在
sbspace 列表中指定循环分布存储。当您在 CREATE TABLE 语句(或 CREATE
TEMP TABLE 语句或 ALTER TABLE 语句 )中包含 PUT 子句时,您可以包含
或不包含为同一表上其它列定义分布存储的 FRAGMENT BY 子句的选项。PUT
子句只对指定多个 sbspace 的智能大对象应用循环存储分布策略。有关更多信息
和示例,请参阅 PUT 子句。
通过 EXPRESSION 分片
在基于表达式的分布方案中,规则中的每个分片表达式都指定了一个存储空间。
规则中的每个分片表达式将数据隔离起来并帮助数据库服务器查找这些行。
要通过表达式对表分片,请指定以下规则之一:

范围规则
范围规则指定使用范围的分片表达式来指定在分片中放置哪些行,如以下示例所
示:
FRAGMENT BY EXPRESSION c1 < 100 IN dbsp1,
c1 >= 100 AND c1 < 200 IN dbsp2, c1 >= 200 IN dbsp3;

仲裁规则

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 397
仲裁规则根据预先定义的 SQL 表达式来指定分片表达式,该表达式通常使用
OR 子句将数据分组,如以下示例所示:
FRAGMENT BY EXPRESSION
zip_num = 95228 OR zip_num = 95443 IN dbsp2,
zip_num = 91120 OR zip_num = 92310 IN dbsp4,
REMAINDER IN dbsp5;
警告: 请参阅日志记录选项这一节中关于 DBCENTURY 环境变量和分片表达式中
数据值的说明。
在具有 NLSCASE INSENSITIVE 属性的数据库中,对 NCHAR 和 NVARCHAR
数据的操作会忽略字符大小写,从而数据库服务将由相同序列字母组成的大小写
变化的字符串视为重复的值。如果通过表达式分片的表的分片键是 NCHAR 或
NVARCHAR 列,则通过字符表达式定义的每个分片将存储符合定义分片的表达
式的所有大小写不同的变量。例如,对于表达式 lname = 'Garcia' ,其中
lname 是 NCHAR 或 NVARCHAR 类型的列,在该列中具有下列值的行将被存
储在相同的分片中。 因为对于这些(并相似)字符串值字符大小写表达式是等价
的:
'Garcia' 'garcia' 'GARCIA' 'GarCia' 'gARCia'
有关 NLSCASE INSENSITIVE 数据库的更多信息,请参阅 CREATE
DATABASE 语句 、在 NLSCASE INSENSITIVE 数据库中重复的行和在区分大
小写的数据库中的 NCHAR 和 NVARCHAR 表达式。
分片表达式中的用户定义的函数
对于包含用户定义的数据类型的行,您可以使用比较条件或用户定义的函数来定
义范围规则。在以下示例中,比较条件为包含不透明数据类型的 long1 列定义了
范围规则:
FRAGMENT BY EXPRESSION
long1 < '3001' IN dbsp1,
long1 BETWEEN '3001' AND '6000' IN dbsp2,
long1 > '6000' IN dbsp3;
隐式的、用户定义的强制转型将 3001 和 6000 转换为不透明类型。
此外,您还可以使用用户定义的函数为 long1 列的不透明数据类型定义范围规
则:

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 398
FRAGMENT BY EXPRESSION
(lessthan(long1,'3001')) IN dbsp1,
(greaterthanorequal(long1,'3001') AND
lessthanorequal(long1,'6000')) IN dbsp2,
(greaterthan(long1,'6000')) IN dbsp3;
如前面的示例所示,显式的用户定义的函数需要在 IN 子句前的整个分片表达式
周围加上括号。
可以用 SPL 或 C 或 Java™ 语言来编写分片表达式中用户定义的函数。这些函数
必须满足四个要求:

必须能对 Boolean 值求值。

它们必须是不可变的。

它们必须驻留在相同数据库的同一表中。

它们不得生成 OUT 或 INOUT 参数。
有关如何为分片表达式创建 UDR 的信息,请参阅 GBase 8s 用户定义的例程和
数据类型开发者指南 。
使用 REMAINDER 关键字
使用 REMAINDER 关键字来指定存储超出指定表达式的有效值的存储空间。如
果不指定 remainder ,并且在一行中插入或更新不符合任何分片定义的值,则数
据库服务器将返回一个错误。
下列示例使用仲裁规则为 c1 列的特定值定义五个分片,以及另一个可以接受所
有值的分片:
CREATE TABLE T1 (c1 INT) FRAGMENT BY EXPRESSION
PARTITION PART_1 (c1 = 10) IN dbs1,
PARTITION PART_2 (c1 = 20) IN dbs1,
PARTITION PART_3 (c1 = 30) IN dbs1,
PARTITION PART_4 (c1 = 40) IN dbs2,
PARTITION PART_5 (c1 = 50) IN dbs2,
PARTITION PART_6 REMAINDER IN dbs2;
此处,前面三个分片存储在 dbs1 dbspace 的分区中,其它分片,包括
remainder ,都存储在 dbs2 dbspace 的分区中。此示例需要有显式的分片名,因
为每个 dbspace 都有多个分区。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 399
通过 LIST 分片
通过列表分片定义每个分片都基于分片键的离散值。
当分片键的值是在该类别集合内没有量化顺序的名义量表上的类别时,您可以使
用此分片策略。当表包含分片键的有限值集合并且表上的查询具有分片键上的等
式谓词时,通过列表分片很有帮助。例如,您可以按地理分片数据,它基于一个
国家内省或洲的列表。每个分片中存储的行可以限制到单个分片键值,或者限制
为表示分片键值的某个逻辑子集的值的列表,提供没有分片键值被两个或多个分
片共享。
通过 LIST 分片还有助于逻辑上隔离数据。
通过 LIST 分片支持这三个功能:

表及其索引都可以通过 LIST 分片。

分片键可以是基于单列或多列的列表达式。

该列表可以可选地包含 remainder 分片。

该列表可以可选地包含只存储 NULL 值的 NULL 分片。
通过 LIST 分片(或在 CREATE INDEX 语句中分片索引 )必须满足这些要
求:

包含 NULL (或 IS NULL)的列表不能包含其它值。

分片键必须基于单行。

分片键必须是列表达式。该常量表达式可基于单列或多列。

列表不能包含重复的常量表达式值。每个值在 FRAGMENT BY LIST 子
句中必须是唯一的。
在以下情景中在通过 LIST 分片的表上进行 Load 、INSERT 、MERGE 或
UPDATE 操作时,会失败:

行的分片键计算为 NULL ,但是 FRAGMENT BY LIST 子句定义的为
非 NULL 值。

行的分片键符合对任何分片都是非常量表达式值的条件,但是没有定义
remainder 分片。
以下是通过 LIST 分片表的示例:
CREATE TABLE customer(id SERIAL, fname CHAR(32), lname CHAR(32),
state CHAR(2), phone CHAR(12))

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 400
FRAGMENT BY LIST (state)
PARTITION p0 VALUES ("KS", "IL") IN dbs0,
PARTITION p1 VALUES ("CA", "OR") IN dbs1,
PARTITION p2 VALUES ("NY", "MN") IN dbs2,
PARTITION p3 VALUES (NULL) IN dbs3,
PARTITION p4 REMAINDER IN dbs3;
在以上示例中,表在列 state 上分片,该列称为分片键或分区键。该分片键可以
是列表达式:
FRAGMENT BY LIST (SUBSTR(phone, 1, 3))
该分片键表达式可以具有多列,如以下示例所示:
FRAGMENT BY LIST (fname[1,1] || lname[1,1])
该分片必须是不能重叠的,即在值列表中不允许重复值。例如,以下表达式列表
对同一表或索引的分片无效,因为它们的 "KS" 表达式重叠:
PARTITION p0 VALUES ("KS", "IL") IN dbs0,
PARTITION p1 VALUES ("CA", "KS") IN dbs1,
PARTITION p0 VALUES ("KS", "OR", "NM") IN dbs0,
该列表值必须是常量字符。例如,标识符或 name 变量在以下列表中是
不允许的:
PARTITION p0 VALUES (name, "KS", "IL") IN dbs0,
NULL 分片是分片键列包含具有 NULL 值的分片。不同于 FRAGMENT BY
EXPRESSION 定义,您不能在相同的 LIST 分片定义中将 NULL 和 其它列表
值组合。例如,下列 VALUES 列表无效:
PARTITION p0 VALUES ("KS", "IL", NULL) IN dbs0,
Remainder 分片是存储分片键值不符合显式定义分片的表达式列表中的任一表达
式的行的分片。如果定义了 remainder 分片,它必须在定义列表分片策略的
FRAGMENT BY 或 PARTITION BY 子句中最后列出的分片。
在 NLSCASE INSENSITIVE 数据库中的 LIST 分片
在具有 NLSCASE INSENSITIVE 属性的数据库中,对 NCHAR 和 NVARCHAR
数据类型的列的操作会忽略字符大小写,因此数据库服务器将由相同序列字母组
成的大小写变化的字符串视为重复的值。如果分片键是 NCHAR 或 NVARCHAR

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 401
列,则定义分片的字符表达式的列表还符合分片表中表达式的字符大小写变化的
列值。
下列示例中,具有 'A' 和 'a' 的 ad_state 列值将存储在 part0 分片/分区中。
CREATE TABLE addr
(
ad_id NCHAR(100),
ad_street NVARCHAR(255),
ad_apt INT,
ad_state NCHAR(2),
ad_zip1 INT,
ad_zip2 INT,
checksum CHAR(48),
PRIMARY KEY(ad_id)
)
FRAGMENT BY LIST(ad_state)
PARTITION part0 VALUES ('A', 'B', 'C', 'D') IN dbs1,
PARTITION part1 VALUES ('E', 'F', 'G', 'H') IN dbs2,
PARTITION part2 VALUES ('I', 'J', 'K', 'L') IN dbs3,
PARTITION part3 VALUES ('M', 'N', 'O', 'P') IN dbs4,
PARTITION part4 VALUES ('Q', 'R', 'S', 'T') IN dbs5,
PARTITION part5 REMAINDER IN dbs6 LOCK MODE ROW;
设计为返回只具有 'A' 或 'a'的行的查询可以在 ad_state 列上应用过滤,以致
于只有第一个分片在查询执行计划中扫描:
SELECT * FROM addr WHERE ad_state = 'A';
以上区分大小写的查处排除了所有的分片,除了只按此分片扫描的 part0 ,其包
含 'A' 或 'a'的行被存储。
有关具有 NLSCASE INSENSITIVE 属性的数据库的更多信息,请参阅 CREATE
DATABASE 语句、在 NLSCASE INSENSITIVE 数据库中重复的行和 在区分大
小写的数据库中的 NCHAR 和 NVARCHAR 表达式。
通过 RANGE INTERVAL 分片
可以使用此存储分布策略将分片将的量化值分片给其数值 或 DATE 或
DATETIME 范围内的非重叠间隔。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 402
基于 RANGE INTERVAL 分片的分布存储通常将表分区为两种分片类型:

范围分片 ,它是您在 FRAGMENT BY 或 PARTITION BY 子句中显式
定义的分片

间隔分片,它是数据库服务器在插入操作期间自动创建的分片。
要根据分片键(也称为分区分片)的范围内的间隔分片表或索引,您必须定义下
列参数:

一个分片键表达式,它基于一个数字、DATE 或 DATETIME 列。

至少一个范围表达式。在特定范围内带有分片键值的行存储在那个分片
中。

对于每一个范围表达式,至少有一个存储相应分片的 dbspace 列表。
您通过特定范围表达式的显式定义的分片称为范围分片。RANGE
INTERVAL 分片的语法要求只有有一个基于范围表达式的分片。
对于系统生成的分片(称为间隔分片),它是数据库服务器自动创建地以存储分
片键值超出当前分片列表上限的行,您可以指定这些额外参数:

每个间隔分片可以存储的在分片键值范围内的间隔大小。

存储间隔分片的 dbspace 列表。
如果指定了间隔大小但是 dbspace 列表为空,则间隔分片将存储在存储范围分片
的同一的 dbspace 中。如果没有指定间隔大小,则禁用间隔分片的自动创建功
能。在那种情况下,范围分片可以存储分片键值在指定范围内的行,但是该表无
法存储有分片键值超出这些范围的行。
CREATE INDEX 语句也支持 RANGE INTERVAL 分片策略。如果一个表具有用
相同的 FRAGMENT BY RANGE 语法定义的连接的索引,则当行超出现有已插
入的间隔时,会类似地自动创建对应的索引分片(与新表分片具有一样的名
称)。
通过范围分片分片的表或索引不支持 REMAINDER 分片,因为如果您定义所有
了以上列出的参数,则数据库服务器自动创建新的间隔分片以存储那些已插入的
分片键值超出现有分片范围的行。
对于不具有 NOT NULL 约束的表,您可以通过指定 VALUES IS NULL 为范围
表达式来定义 NULL 分片。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 403
当不知道增长的表中所有的可能分片键值,且 DBA 不想未还未存在的数据预分
配分片时,RANGE INTERVAL 分片策略会很有用。
以下是通过范围间隔分片表的示例,它使用整数列作为分区键:
CREATE TABLE employee (id INTEGER, name CHAR(32), basepay DECIMAL
(10,2),
varpay DECIMAL (10,2), dept CHAR(2), hiredate DATE)
FRAGMENT BY RANGE (id)
INTERVAL (100) STORE IN (dbs1, dbs2, dbs3, dbs4)
PARTITION p0 VALUES IS NULL IN dbs0,
PARTITION p1 VALUES < 200 IN dbs1,
PARTITION p2 VALUES < 400 IN dbs2;
在此表中
 间隔大小的值为 100,
 该分片键是 employee.id 列的值,
 VALUES IS NULL 关键字定义 p0 作为存储没有 id 列值的行的表分片。
当 employee ID 超过 199 ,自动创建 100 间隔(指定分间隔大小)的分片。
如果带有 employee ID 405 的行被插入,则会创建新的间隔分片来容纳此行,新
的分片拥有id 列值在 >= 400 AND < 500 范围的行。
如果更改了行,且将 employee ID 更改为 821,则数据库服务器创建新的分片来
容纳新的行。该分片拥有 id 列值在 >= 800 AND < 900 范围的行。
间隔分片创建于 STORE IN 子句定的 dbspace 中的循环分布方案中。如果忽略了
该子句,则间隔分片将会在存储范围分片的 dbspace (之前例子中的 dbspace
dbs0 、dbs1 和 dbs2 )中创建。如果为间隔分片指定的 dbspace 已满或关闭,
则数据库服务器略过此 dbspace ,选择列表中下一个 dbspace 。
注意此间隔分片的范围表达式不能重叠,且不能有 remainder 分片。
范围间隔分片的分片键只能引用单列。例如,以下规范无效:
FRAGMENT BY RANGE (basepay + varpay)
分片键可以是列表达式,如下例规范所示:
FRAGMENT BY RANGE ((ROUND(basepay))

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 404
创建分片不需要互斥锁。分片键表达式必须评估为数字、DATE 或 DATETIME
数据类型。例如,您可以为每一个月创建一个分片,或为每百万客户记录创建一
个分片。间隔大小规范(在 INTERVAL 关键字之后 )必须是

一个数字数据类型的非零整数常量表达式(对于数字分片键),

或 INTERVAL 数据类型(对于 DATE 或 DATETIME 分片键)。
SQL 的 ALTER FRAGMENT 语句可以在非分片表或索引上应用 RANGE
INTERVAL 存储分布,如 INIT 子句 中描述的那样。该语句还会修改现有
RANGE INTERVAL 策略的功能。有关更多信息和示例,请参阅 MODIFY 子句
和带有区间分片的 MODIFY 子句的示例。
Interval fragment 子句
使用 Interval Fragment 子句存储通过一个或多个计算为数字或 INTERVAL 数据
类型的范围表达式定义的行。在您为一个分片指定至少一个非 NULL 范围后,数
据库服务器在插入分片键值超出现有分片的范围的行的 DML 操作中自动创建新
的间隔分片。
CREATE TABLE 语句的 Interval Fragment 子句支持以下语法:
Interval Fragment 子句

元素
描述
限制
语法

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 405
dbspace
存储分片的
dbspace 名称
最多只能指定 2,048 个
dbspaces 。所有存储分片的
dbspaces 必须具有相同的页
面大小。
标识符
dbspace
_fun
返回 dbspace
的名称的 UDF
当数据库服务器调用 UDR 为
新分片分配存储时,用户定义
的函数以及返回的 dbspace
必须存在
CREATE
FUNCTION 语句
intvl_
valexpr
在分片键范围
捏定义间隔大
小的间隔值表
达式
必须是与分片键表达式的数据
类型符合的求值为数字或
INTERVAL 值的常量字符表达

标识符
partition
此处为范围分
片声明的名称
在同一表的分片名称中必须是
唯一的。如果表和它的索引使
用同一范围间隔分片策略,则
每个索引分片必须具有与对应
表分片相同的名称。
标识符
range
_expr
定义分片中分
片键的上限的
常量表达式
必须是与分片键表达式的数据
类型符合的求值为数字或
INTERVAL 值的常量字符表达

常量表达式
用法
Interval Fragment 子句定义紧跟在 FRAGMENT BY 子句的 FRAGMENT BY
RANGE 关键字之后指定的分片键表达式范围内的一个或多个非重叠的间隔。
PARTITION BY RANGE 关键字是 FRAGMENT BY RANGE 关键字的同义词。
如果向表中插入或更改符合为此分片定义的范围的 DML 操作,那么数据库服务
器将新的或更改的行存储在那个分片中。
必须定义指示一个分片以存储具有非 NULL 分片键值的行。对于分片键值为
NULL 的行不需要定义分片。但是如果没有为 NULL 值定义分片,则对表会产
生带有 NULL 分片键值的 DML 操作会失败。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 406
Interval Fragment 子句无法定义 remainder 分片。
对于由包含 Rolling Window 子句的 Interval Fragment 子句定义的分布存储
表,数据库服务器在创建了超出用户定义的上限的足够多新的间隔分片时会自动
拆离表分片。您可以使用 Rolling Window 子句定义以下一个或所有的限制:

系统生成的间隔分片的当前数量,

或者为表以及它的索引分配的存储空间的总大小。
有关 Rolling Window 表的行为和语法的信息,请参阅上面语法图中的链接。
INTERVAL 大小规范
INTERVAL 关键字之后的 intvl_valexpr 表达式定义在分片键值范围内的分片的
大小。
intvl_valexpr 表达式的数据类型取决于 RANGE 关键字之后的分片键列的数据类
型:

如果分片键是数字数据类型,则 intvl_valexpr 表达式必须计算为一个数
字值。数字 intvl_valexpr 表达式必须是大于零没有小数部分的常量表达
式。

如果分片键是 DATE 或 DATETIME 数据类型,则 intvl_valexpr 表达
式必须计算为 INTERVAL 值。INTERVAL intvl_valexpr 表达式必须是
大于零的常量表达式。
intvl_valexpr 表达式的最小值取决于分片键表达式的数据类型。

如果分片键是 DATETIME 列则最小值是一秒

如果分片键是 DATE 列则最小值是一天

如果分片键是数值列则最小值是 1 。
您可以使用字符数值或者字符 INTERVAL 值作为 intvl_valexpr 表达式。还可以
使用内置的 NUMTODSINTERVAL 、NUMTOYMINTERVAL 、
TO_DSINTERVAL 或 TO_YMINTERVAL 函数指定 intvl_valexpr 表达式。有关
这些函数的语法和在 Interval Fragment 子句中使用它们的示例,请参阅
TO_YMINTERVAL 函数 和 TO_DSINTERVAL 函数。
如果您没有指定 intvl_valexpr 表达式,则禁用间隔分片的自动创建功能,但是
INTERVAL 关键字之后仍需要空的括号来避免语法错误。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 407
STORE IN 规范
当 DML 操作存储分片键值超出现有分片范围的行时,紧随 STORE IN 关键字之
后的 dbspace (或以逗号分隔的 dbspace 名称列表)为服务器自动创建的新的间
隔分片标识存储空间。如果您指定多个 dbspace ,则数据库服务器在 STORE IN
子句中指定的 dbspace 的循环分布方案中创建间隔分片,并为此新的分片声明系
统生成的名称。
当创建表或索引时,不需要显示 STORE IN 子句中的 dbspace 。您可以在创建表
或索引后向系统中添加 dbspace。所有 Interval Fragment 子句中引用的 dbspace
必须具有相同的页大小。
如果您省略了 STORE IN 子句, 且表需要存储超出现有分片和范围分片的行
时,数据库服务器自动在范围表达式分片的 PARTITION 规范列表的 dbspace 的
循环分布方案中创建新的间隔分片。
STORE IN 子句可以可选地指定一个返回现有 dbspace 名称的用户定义的函数,
而不是文本 dbspace 标识符列表。您为此 UDF 声明的标识符是任意的。
此函数接受四个参数:

表的所有者,CHAR(32) 数据类型

表的名称,CHAR(255) 数据类型

与分片键同一数据类型的分片值,或者可以隐式强制转型为那个数据类型
的兼容类型

重新尝试标记,INT 数据类型。
重要:
然而,当您在 STORE IN 子句中引用任意 UDR 时,不要给 UDF 指定任何参
数。它所需要的仅是 UDF 名称,紧随在一对空括号之后,像以上语法图中所指
示的那样。数据库服务器自动在调用时自动提供参数。
此处有一个可返回 dbspace 名称的 UDF 示例,CREATE TABLE 语句定义了按
范围分片分片的表,并在 STORE IN 子句中调用了该函数:
CREATE FUNCTION mydbname
(
owner CHAR(255),
table CHAR(255),

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 408
value DATE,
-- Data type must match or must be compatible
-- with the data type of the fragment key
retry INTEGER
)
RETURNING CHAR(255)
IF (retry > 0)
THEN
RETURN NULL; -- This UDF does not handle retries: if the first call
-- fails, an invalid dbspace is returned, and the DML
-- statement that requires a new fragment also fails.
END IF;
IF (MONTH(value) < 7)
THEN
RETURN "dbs1";
ELSE
RETURN "dbs2";
END IF;
END FUNCTION;

CREATE TABLE orders
(
order_num SERIAL(1001),
order_date DATE,
customer_num INTEGER NOT NULL,
ship_instruct CHAR(40),
backlog CHAR(1),
po_num CHAR(10),
ship_date DATE,
ship_weight DECIMAL(8,2),
ship_charge MONEY(6),
paid_date DATE
)
PARTITION BY RANGE(order_date) INTERVAL(1 UNITS MONTH)
STORE IN (mydbname())
PARTITION prv_partition VALUES < DATE("01/01/2010") IN mydbs;
当需要为此表创建新的间隔分片时,数据库服务器定义指定的函数。如果在返回
的 dbspace 中尝试创建分片失败,则用 retry 标记设置第二次调用相同的函数,

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 409
以致于会返回一个不同的现有 dbspace 名称。第二次尝试失败后,执行的 DML
语句返回错误。(如果第一次尝试失败,则以上示例中的 UDF 不会进行第二次
尝试,但是返回 NULL ,一个无效的 dbspace 名称。)
用户定义的范围分片
在 Interval Fragment 子句中必须定义至少一个范围分片。声明每个分片需要这些
元素:

PARTITION 关键字,后面跟随您为此分片生成的名称。表的其它分片不
能具有相同的名称。

VALUES 值,后跟具有以下其中其中之一格式的 Boolean 表达式:
o
小于( < )关系运算符和范围表达式,它定义可以存储在分片中
分片键值的上限
o
IS NULL 运算符。如果分片键采用 NULL 值,您可以使用此运
算符定义 NULL 分片,该分片只存储将 NULL 作为其分片键值
的行。
只能定义一个 IS NULL 运算符分片。NULL 分片并不是必需的,但是如果
NULL 分片不存在,而用户尝试插入分片键列为 NULL 的行时,数据库服
务器返回错误。

IN 关键字,后跟存储该分片的 dbspace 的名称。它可以还是 STORE IN
规范引用的 dbspace ,或者不在 STORE IN 列表中包含的 dbspace 。
如果范围分片没有按升序顺序定义,则数据库服务器按升序顺序存储它们,因此
在第一个初始位置的分片具有最小的上限范围。
在相同的 Interval Fragment 子句中的两个分片不能具有相同的上限。
PARTITION 规范中定义的范围分片不能重叠。如果(intvl_valexpr)大小规范在
INTERVAL 关键字之后, 那么如果定义连续范围分片的范围表达式之间的差异与
INTERVAL 大小规范不同,则数据库服务器发出错误。
NULL 分片并非必需,但如果用户尝试擦汗荣分片键值是 NULL 的行,而不存
在 NULL 分片时,数据库服务器返回错误。
重要:

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 410
dbschema -ss 命令的输出显示了通过范围间隔分布方案分片的表的结构,该方案
只返回用户在 CREATE TABLE 或 ALTER FRAGMENT 语句中的定义的范围分
片。
此情况同样对于 dbexport -ss 命令的输出同样为真。
系统生成的间隔分片
当您使用 Interval Fragment 子句定义表或索引的范围分片时,不需要知道分片键
值的全部范围。当插入一个不适合范围分片或间隔分片的行是,数据库服务器自
动创建新的间隔分片来存储该行(基于间隔 intvl_valexp,不用 DBA 干预)。
表或索引的间隔分区的系统生成的名称是 sys_evalpos,evalpos 是系统目录中的
此分片 sysfragments.evalpos 条目。如果表和它的索引使用相同的范围间隔分片策
略,每个系统生成的索引分片将具有与该表的系统生成的分片相同的标识符。
这些自动生成的分片对应于包括新数据值的分片键范围的部分。如果在两个连续
分片之间大于 intvl_valexp 范围的一部分不包含行,则间隙可以自动生成间隔分
片。但是,在您在 Interval Fragment 子句中显式定义的分片之间是不允许间隙
的。
如果未指定 intvl_valexp 表达式,则在 Interval Fragment 子句中显式定义的范围
分片可用于存储在其范围间隔内具有对应分片键值的行,以及在禁用 ALTER
FRAGMENT 以及之前生成的任何现有间隔分片自动创建间隔分片。然而,在这
两种情况中,禁用自动创建新分片。如果用户尝试插入分片键值不在现有分片范
围内的行,则数据库服务器发出错误 -772,并插入失败。
如上所述,dbschema -ss 和 dbexport -ss 命令显示按范围间隔分片的表的模式的输
出仅包括用户定义的范围分片。在输出显示中不会显示系统生成的间隔分片。
但是,当从 dbexport 数据文件加载数据记录时,数据库服务器自动创建额外的
间隔分片,

基于范围分片和间隔过渡分片,

和插入的行中的分片键值,

以及 Interval Fragment 子句的其它存储规范,注册于系统目录中。
范围间隔分片的示例

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 411
以下示例使用 INT 列 cust_id 的值作为数字分片键,并定义了四个范围分片。数
据库服务器将为 cust_id 值超过 7999999 的插入行创建间隔大小是 1000000 的
间隔发分片:
CREATE TABLE customer (cust_id INT, name CHAR (128), street CHAR
(1024),
state CHAR (2), zipcode CHAR (5), phone CHAR (12))
FRAGMENT BY RANGE (cust_id)
INTERVAL (1000000) STORE IN (dbs2, dbs1)
PARTITION p0 VALUES < 2000000 IN dbs1,
PARTITION p1 VALUES < 4000000 IN dbs1,
PARTITION p2 VALUES < 6000000 IN dbs2,
PARTITION p3 VALUES < 8000000 IN dbs3;
在以下 DATETIME 分片键示例中,如果 dt1 列的值超过 VALUES 子句指定的
范围分片的界限,则将在 25 年间隔中在 2005 年之后的 dbs1 dbspace 中创建间
隔分片:
CREATE TABLE t1 (c1 int, d1 date, dt1 DATETIME YEAR TO FRACTION)
FRAGMENT BY RANGE (dt1) INTERVAL (INTERVAL(25) YEAR(2) TO
YEAR)
PARTITION p1 VALUES <
DATETIME(2006-01-01 00:00:00.00000) YEAR TO FRACTION(5) IN
dbs1;
在下一个示例中,DATE 列 order_date 的值是分片键,并且定义了四个范围分
片,包括 order_date 具有 NULL 值的行的 p4。对于 order_date 的年值晚于
2007 的插入行,将在 01/01/2008 之后的 1 个月内自动创建间隔分片,并在
dbs1 、dbs2 和 dbs3 dbspace 中创建连续分片:
CREATE TABLE orders (order_id INT, cust_id INT,
order_date DATE, order_desc CHAR (1024))
FRAGMENT BY RANGE (order_date)
INTERVAL (NUMTOYMINTERVAL (1,'MONTH')) STORE IN (dbs1, dbs2,
dbs3)
PARTITION p0 VALUES < DATE ('01/01/2005') IN dbs1,
PARTITION p1 VALUES < DATE ('01/01/2006') IN dbs1,
PARTITION p2 VALUES < DATE ('01/01/2007') IN dbs2,
PARTITION p3 VALUES < DATE ('01/01/2008') IN dbs3,
PARTITION p4 VALUES IS NULL in dbs3;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 412
下一个 DATE 分片键的示例与先前的示例类似,但是此处的间隔大小指定为 1.5
年。在 12/31/2009 之后,对于 order_date 值,将以 18 个月(1.5 年)的间隔创
建间隔分片:
CREATE TABLE orders1 (order_id INT, cust_id INT, order_date DATE,
order_desc CHAR (1024))
FRAGMENT BY RANGE (order_date)
INTERVAL (NUMTOYMINTERVAL (1.5,'YEAR')) 000STORE IN (dbs1, dbs2,
dbs3)
PARTITION p0 VALUES < DATE ('01/01/2004') IN dbs1,
PARTITION p1 VALUES < DATE ('01/01/2006') IN dbs1,
PARTITION p2 VALUES < DATE ('01/01/2008') IN dbs2,
PARTITION p3 VALUES < DATE ('01/01/2010') IN dbs3;
如果 order_date 值丢失,则不能将行插入 orders1 表。因为没有定义非 NULL
分片。有关向现有使用范围间隔分片的表中添加 NULL 分片的语法,请参阅
ALTER FRAGMENT 语句的 ADD 子r 句主题。

Rolling Window 子句
使用 Rolling Window 子句来定义表或它的索引的范围分片分布存储策
略,并定义清除策略以拆离过剩的分片。就像其它具有范围间隔分片的表
一样,每个 rolling window table 的新的间隔分片是通过数据库服务器自动
创建地,以用来存储超出当前分片范围的分片键值的新行。当分片的集合
超出清除策略针对分片的数量或针对所分配的存储大小定义的用户定义的
"window" 之后,数据库服务器标识并拆离来自数据库中所有的滚动窗口
表的过剩分片。缺省情况下,它们的清除策略作为调度程序的日常任务而
强制执行。
Rolling Window 子句
使用 Rolling Window 子句来定义表或它的索引的范围分片分布存储策略,并定义
清除策略以拆离过剩的分片。就像其它具有范围间隔分片的表一样,每个 rolling
window table 的新的间隔分片是通过数据库服务器自动创建地,以用来存储超出
当前分片范围的分片键值的新行。当分片的集合超出清除策略针对分片的数量或
针对所分配的存储大小定义的用户定义的 "window" 之后,数据库服务器标识并
拆离来自数据库中所有的滚动窗口表的过剩分片。缺省情况下,它们的清除策略
作为调度程序的日常任务而强制执行。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 413
CREATE TABLE 的 Rolling Window 子句支持下列语法:
Rolling Window 子句

Rolling Window (no size limit)

Rolling Window (with size limit)

元素
描述
限制
语法
quantity 滚动间隔分片
的最大数量
必须是大于零的整数。用户定
义的范围分片不包含在此限制
内。
字符整数
size
表的总存储大
小的上限
必须大于零
字符整数
units
表的总质量存
储的缩写单位
必须是 K 、KB 、KiB 、M 、
MB 、MiB 、G 、GB 、GiB 、
T 、TB 、TiB (或者这些字符
的小写)。尾随任何字符都会
导致语法错误。
不带引号的字符

用法

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 414
INTERVAL 分片子句可启用新分片基于间隔分片表达式的自动创建功能。不像一
般的范围间隔分布存储,它创建新的分片,但不提供对随着时间增长表的大小的
管理,Rolling Window 选项定义间隔分片的当前数量的上限,或为表和其索引分
配的总存储的大小或者这两者限制。在超过这些限制后,数据库服务器自动归档
或销毁 Rolling Window 子句标识为超出的分片,并用基于 Rolling Window 子句
定义的清除策略的新的间隔分片替换它们。
范围间隔分布存储策略包含 Rolling Window 子句的表称为 rolling window
tables。数据库服务器为 Rolling Window 表创建的间隔分片称为 滚动分片 。
与启用 AUTOLOCATE 配置参数或会话环境设置创建的表的循环分片不同,本子
句定义的滚动分片的动态 "window" 可以支持查询中的分片消除,其中
numeric 、DATE 和 DATETIME 表达式中的分片键值与查询谓词相关。滚动窗
口表的另一个效率是当计划程序通过运行 purge_tables 任务强制执行清除策略时
自动归档或销毁过多的碎片。
Rolling Window 子句定义自动从表中删除现有分片的以下任一条件或两个条件:

ROLLING FRAGMENTS 关键字指定了表的间隔分片数量可以同时存在
的限制。

LIMIT TO 关键字为分配给表及其索引的总存储空间指定了限制。
当超过其中之一的限制时,超出时间间隔的分片将被数据库服务器自动销毁或拆
离,如分别使用 DISCARD 或 DETACH 关键字指定。这些规范定义了表的清除
策略。此策略通过定义自动删除现有分片的标准以及自动替换这些分片以插入新
数据记录的新空分片来限制表可以存储多少数据。
滚动窗口表的清除策略
Rolling Window 子句为此表定义清除策略。 此清除策略通过定义自动拆离表分片
的条件,在表达到滚动分片数量的用户指定的限制或分配的存储的总大小后,限
制表可以存储多少数据。当启用清除策略时,数据库服务器自动用新的空的分片
替换已拆离的分片以插入新的数据记录。
当达到清除策略的限制后,拆离分片的数量取决于定义此限制的关键字和定义此
清除策略操作的关键字:

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

对于使用 ROLLING INTERVALS 关键字指定分片数量限制,只会考虑
间隔分片。它们按最低分片键值的顺序拆离,如系统目录中分片的
sysfragments.evalpos 值所示。
此选择拆离间隔分片的行为等价于 INTERVAL FIRST 关键字使用
LIMIT TO 选项指定的行为。然而,ROLLING INTERVALS 选项不支持
显式 INTERVAL FIRST 关键字,和任何在 DETACH 或 DISCARD 清除
规范之后随后的 LIMIT TO 选项关键字。
ROLLING INTERVALS 选项还不提供拆离范围分片,因为 DETACH 或
DISCARD 清除之后,没有保留的范围分片。出于此原因,包含范围分片
作为 ROLLING INTERVALS 选项(Rolling Window 子句语法也不支
持)不会减少驻留在表中的分片数量。

对于使用 LIMIT TO 关键字指定已分配的存储大小限制,三个关键字选
项可以指示拆离哪些分片:
o
如果 ANY 关键字紧随在 DETACH 或 DISCARD 关键字之后,则
会拆离范围或间隔分片,从 sysfragments.evalpos 值最低的分片
开始。清除策略指定 ANY 为拆离的分片时可以减少当前已分配存
储的大小,但是如上所述,拆离范围分片不会减少分片的总数。
o
如果指定 INTERVAL ONLY 关键字,那么只拆离间隔分片,也是
从 sysfragments.evalpos 值最低的分片开始。
如果不存在间隔分片,则数据库服务器不会满足 LIMIT 子句的限
制。如果该项发生在现有的滚动窗口表中,您必须考虑使用
ALTER FRAGMENT MODIFY INTERVAL 语句更改清除策略,以
致于范围分片可以被拆离。可以通过将 INTERVAL ONLY 关键字
替换为 ANY or INTERVAL FIRST 关键字来实现。反之如果您的
存储策略支持较大的大小限制,则您可以使用 ALTER
FRAGMENT 添加 LIMIT TO size 值。
o
如果 INTERVAL FIRST 关键字紧跟着 DETACH 或 DISCARD
关键字,则数据库服务器首先拆离间隔分片,从最低的
sysfragments.evalpos 值开始,直到满足分配的存储大小需求。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 416
如果 Rolling Window 子句包含 LIMIT TO 关键字,但是没有上面的选
项中的分片被拆离,那么缺省情况下 INTERVAL FIRST 策略决定拆离
哪个分片。
如果已经拆离了所有的间隔分片,而还没有填满存储大小限制,则作为安
全措施,数据库服务器拆离范围分片,从最低值开始。在任何情况下,当
范围分片被拆离或丢弃时,它们被新的空的分片代替以存储相同范围的
值,因此该表的结构被保留。
对已清除的分片中的数据的处置
Rolling Window 子句提供两个关键字选项,DETACH 和 DISCARD ,用于自动主力
滚动窗口表的已拆离的分片。这里对此关键字的选择没有缺省值。如果 Rolling
Window 子句没有包含 DETACH 或 DISCARD 关键字则数据库服务器返回错误。

使用 DETACH 将分片与数据库服务器自动创建的独立的表建立连接,且
表并标识符是这种格式:
< original_table_name >_< lower value >_< higher value >
此处的 lower_value 和 higher_value 是该分片被拆离之间间隔范围的最
小值和最大值。
如果表的名称已经存在,则会在 higher_value 之后附加一个数字计数,
第一个附加表从 _1 开始:
< original_table_name >_< lower value >_< higher value >_1
等等等等,用 _2 附加到下一个表名称(或者如果附加 _2 不能产生一
个唯一的表名称,则附加更多的整数)。

使用 DISCARD 销毁已拆离的分片。
DISCARD 关键字指定删除已经成功拆离的分片,以致于当执行清除策略
时,不需要的数据记录会及时移除。通过这种方法,过渡分片的数量或滚
动窗口表的存储空间总量会约束到规定值。
这些配置选项旨在自动化由范围间隔分片的表的空间管理,以致于不需要的数据
记录会及时移除,且存储空间被包含到规定量。丢弃数据的另一种方法是拆离分

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 417
片。这提供了从不正确指定的清除策略恢复的机会,并允许将清除的分片(或者
它们的数据被移动)附加到归档。
强制执行清除策略
在具有有限存储的数据库中,插入新行的 DML 或加载操作(包括插入超出现有
分片的范围行)可能导致分配的存储大小或超过 Rolling Window 子句为一个或多
个滚动窗口表指定的限制的间隔分片的数量。
但是,在它的界限超出的那一刻,不会立即执行 Rolling window 表的清除策略。
清除策略被设计为在移除和处理滚动窗口表表的分片的所需的 ALTER
FRAGMENT DETACH 和 ALTER FRAGMENT ATTACH 操作不可能与并发用户
的访问尝试冲突时作为调度任务每天强制执行。缺省情况下,清除策略会在每天
本地时间 00:45 执行。有关更多信息,请参阅 GBase 8s 管理员指南 中
Scheduler 的内置 purge_tables 任务的描述。
清除策略也可以通过运行 syspurge( ) 系统函数来强制执行。在 DBA 调用此函数
之后,数据库服务器检测系统目录,并标识清除策略已经超出的滚动窗口表。然
后数据库服务器按照清除策略的指定丢弃或拆离、限定滚动分片直到满足清除策
略,或者直到没有更多的滚动分片能移除。syspurge( ) 函数不需要参数,但是接
受启用联机日志诊断的可选参数。
更改、删除或添加清除策略
可以使用 ALTER FRAGMENT 语句更改或删除滚动窗口表的清除策略。或将创
建时具有其它存储选项的表更改为滚动窗口表。例如,简单地通过添加清除策
略, ALTER FRAGMENT 语句的 Rolling Window 子句可将使用简单范围间隔分
片的表更改为滚动窗口表。
CREATE TABLE 语句的 Rolling Window 子句支持 ALTER FRAGMENT ON
TABLE . . . MODIFY INTERVAL 语句中的 Rolling Window 子句语法的子集。
如果您不满意现有滚动窗口表的清除策略。则可以使用 ALTER FRAGMENT 语句以
多种方法更改此策略,包括:

更改 ROLLING FRAGMENTS 或 LIMIT TO 规范,

替换清除策略的 DETACH 或 DISCARD 关键字

使用 DISABLE 关键字选项终止清除策略

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

通过 ENABLE 关键字重新启用一个已终止的清除策略

移除该清除策略和滚动窗口表的滚动分片
要将滚动分布存储策略更改为简单的范围间隔分片策略,您可以为此表运行
ALTER FRAGMENT MODIFY INTERVAL DROP ALL ROLLING 语句。如果您要
保留这些数据,则在做此操作之前首先归档表的非空滚动间隔分片中的行。
滚动窗口表的限制
使用 ROLLING INTERVALS 或 LIMIT TO 关键字定义滚动窗口分片策略的表,和其
清除策略具有以下限制:

Rolling Window 子句为滚动窗口分片定义的清除策略需要数据库服务器
在满足 DETACH 或 DISCARD 标准的分片上执行 ALTER FRAGMENT
DETACH 操作。 具有被启用的外键约束引用主键的列的表或具有
ROWID 的表不允许 ALTER FRAGMENT DETACH 语句。出于此原
因,CREATE TABLE 和 ALTER FRAGMENT MODIFY INTERVAL 语
句不能在具有主键约束或 ROWID 影子列的表上定义分片清除策略。

任何定义在滚动窗口表上的索引都必须具有与滚动窗口表相同的存储分
布。

只有具有 DBA 存取权限的用户才能调用实现拆离滚动分片的 DETACH
或 DISCARD 选项的例程。 具有 RESOURCE 存取权限的用户可以执行
syspurge( ) 函数,但是只能对您自己所拥有的表执行清除策略。

数据库服务器会静默地忽略高可用数据复制(HDR)集群环境中辅助服
务器上任何 syspurge( ) 函数的调用。这是因为集群环境不会复制滚动窗
口清除策略核心中 DETACH 和 DISCARD 选项触发的 ALTER
FRAGMENT 更改。

同样,在 grid 环境中,不会执行复制表行清除策略。
没有存储大小限制的滚动窗口表
以下 CREATE TABLE 语句的示例定义了一个范围间隔分片存储策略,包括把
p4 作为 NULL 分片以存储 order_date 分片键列值为 NULL 的行。因为此分片
键的范围内的间隔定义为一个月,且分片过渡值是 2014 的第一天,则当具有比
2013 年晚一年内插入 order_date 值的记录时,会生成第一个间隔分片。连续的
间隔分片将会以循环的形式存储在 dbspaces dbs1 、dbs2 和 dbs3 中:
CREATE TABLE orders
(order_id INT, cust_id INT,

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 419
order_date DATE, order_desc CHAR (1024))
FRAGMENT BY RANGE (order_date)
INTERVAL (NUMTOYMINTERVAL (1,'MONTH'))
ROLLING (3 FRAGMENTS) DETACH
STORE IN (dbs1, dbs2, dbs3)
PARTITION p0 VALUES < DATE ('01/01/2014') IN dbs1,
PARTITION p4 VALUES IS NULL in dbs3;
在以上示例中,Rolling Window 子句将滚动间隔分片的最大数量设置为
3 。如果在 2014 年前三个月的每一个中添加行,则在该年的三月将生
成三个滚动分片,因为每个新的间隔分片仅存储一个月的数据。如果在
4 月创建了第 4 个时间间隔分片,这将超过滚动分片上的清除策略限
制。由于未指定存储大小限制,因此默认的 INTERVAL FIRST 标准将
拆离四个滚动分片中其 evalpos 值最小的间隔分片。该分片将附加到另
一个表中,而不是销毁,因为清除策略指定 DETACH,而不是
DISCARD。
具有存储大小限制的滚动窗口
对于 employee 表,以下范围间隔分布式存储策略使用 INTEGER 列 emp_id 中
的值作为主键列,1000 是滚动间隔分片的此分片键范围内的间隔。在三个范围分
片中,最后一个具有 20000 的间隔跃迁值,这意味着当插入 emp_id 值为 20002
或更大时,将生成第一个滚动间隔分片。滚动间隔分片将再次以循环方式存储在
dbspaces dbs1 、dbs2 和 dbs3 中:
CREATE TABLE employee
(emp_id INTEGER, emp_name CHAR(64),
ssn CHAR(12), basepay FLOAT, varpay FLOAT,
dept_id SMALLINT, hire_date DATE)
FRAGMENT BY RANGE(emp_id)
INTERVAL(1000)
ROLLING ( 10 FRAGMENTS )
LIMIT TO 100000MiB DETACH ANY
STORE IN (dbs1, dbs2, dbs3)
PARTITION p1 VALUES < 5000 IN dbs0,
PARTITION p2 VALUES < 10000 IN dbs0,
PARTITION p3 VALUES < 20000 IN dbs4;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 420
这里的 Rolling Window 子句将滚动间隔分片的最大数量设置为 10 。除非以下任
一事件发生否则此清除策略将不会强制执行:

数据库服务器在将记录插入到三个 3 个分片中的任何分片范围之外之后
创建了第 11 个滚动分片,或者在需要第 11 个间隔分片的时候, 创建
10 个滚动间隔分片。

数据库服务器为 employee 表及其索引分配的总存储空间超过 100000 兆
字节。
如果在存储大小限制之前 10 滚动间隔的限制已经超出,则数据库服务器将会在
11 个滚动分片中拆离 evalpos 值最小的间隔分片。
如果超过 100000 兆字节超过了数量的限制,则 DETACH ANY 选项运行数据库
服务器选择任何范围分片或间隔分片以拆离。
在任一情况下,此分片将被附加到另一个表,而不是被销毁,因为清除策略指定
了 DETACH ,而不是 DISCARD 。
列表分片子句
使用 List Fragment 子句指定存储在同一分片中分片键值的列表。分配给每个分片
的行必须符合定义此分片的分片键值(或以逗号分隔的分片键值列表中的一个
值)。
List Fragment 子句

List Expression 子句


GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 421
元素
描述
限制
语法
const_expr
为要存储的分片
定义分片键值列
表的常量表达式
必须是带引号的字符串或字符
值。列表中的每个值在同一对
象的分片列表中必须是唯一
的。
常量表达式
dbspace
存储分片的
dbspace
最多只能指定 2,048 个
dbspaces。这些所有的
dbspaces 必须具有相同的页
大小。
标识符
partition
此处为分片声明
的名称
在同一对象的分片的名称中必
须是唯一的。如果表和它的索
引使用相同的列表分片存储策
略,则每个索引分片必须具有
与相应表分片一样的名称。
标识符
在基于列表存储分布中的 REMAINDER 和 NULL 分片
对于任何分片,可以可选地定义 REMAINDER 分片来存储不符合分片键值列表
的行。
可以可选地定义 NULL 分片,以存储具有缺失分片键数据的行。做法为在该分片
的列表表达式子句的 VALUES 关键字之后只指定 IS NULL 或 NULL。您不能在包
含其它表达式的表达式列表中包含 NULL 或 IS NULL 。(在此上下文中,NULL
和 IS NULL 是关键字同义词。)
如果没有定义 NULL 分片,且有一个操作试图插入缺少分片键数据的行,则其结
果取决于 REMAINDER 分片是否存在:

如果定义了 REMAINDER 分片,则行存储在 REMAINDER 分片中。

如果没有定义 REMAINDER 分片,则数据库服务器发出异常。
如果没有定义 REMAINDER 分片,而 INSERT 、UPDATE 、MERGE 或其它
DML 操作试图存储一个分片键与所有分片的列表值不符合的行,则数据库服务器
发出异常。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 422
当您为表或索引定义一个基于列表的分区方案时,该分片列表最多只能包含一个
NULL 分片,和一个 REMAINDER 分片。
如果 BY LIST 分区的表没有 NULL 或 REMAINDER 分片,但是您紧跟地决定
需要这些分片或需要其中一个,可以通过使用 ALTER FRAGMENT 语句的 ADD
选项在分片列表中添加 NULL 分片或 REMAINDER 分片(或者两者都添加)。
有关更多信息,请参阅 ADD 子句。
表达式分片子句
表达式分片子句

元素
描述
限制
语法
part
分片的名称
如果 part 作为该表的另一个分片存
储在同一的 dbspace 中,则需要此元
素。在相同表的分片名称中必须是唯
一的。
标识符
dbspace 存储此表分片
的 dbspace
至多只能指定 2,048 个 dbspaces。
所有存取分片的 dbspaces 必须具有
相同的页大小。
标识符
expr
定义分片的表
达式,它基于
列值
必须返回 Boolean 值(true 或
false)。数据值必须来自该表中的一
行。
表达式
EXTENT SIZE 选项
EXTENT SIZE 选项可以定义分配到该表的存储 extent 的大小。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 423
EXTENT SIZE 选项

元素
描述
限制
语法
first_kilobytes
表的第一个 extent
的长度,单位是千字
节;缺省值是 16。
必须返回正整数;最
大值是 chunk 大小
表达式
next_kilobytes
每个后继 extent 的
长度,单位是千字
节;缺省值是 16。
必须返回正整数;最
大值是 chunk 大小
表达式
用法
first_kilobytes 的最小长度(和 next_kilobytes 的)是您系统的磁盘页大小的四
倍。例如,如果您有 2 千字节大小的页的系统,则最小长度是 8 千字节。
如果 CREATE TABLE(或 CREATE TEMP TABLE)语句不包含 IN dbspace 子
句,则没有 EXTENT SIZE 规范,且没有 NEXT SIZE 规范,且不会为此表分片
存储,直到向表中插入至少一条数据行。第一个 extent 的缺省大小不是 16 千字
节就是4 页面。
下个示例指定第一个 extent 大小为 20 千字节,并允许其余的 extent 使用缺
省大小:
CREATE TABLE emp_info
(
f_name CHAR(20),
l_name CHAR(20),
position CHAR(20),
start_date DATETIME YEAR TO DAY,
comments VARCHAR(255)
)
EXTENT SIZE 20;
如果表中没有数据,则您可以使用 SQL 的 ALTER TABLE MODIFY EXTENT
SIZE 或 ALTER TABLE MODIFY NEXT SIZE 语句更改此空表的第一个 extent

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 424
和随后的 extent 的大小。然而,对于包含一行或多行的表,并不支持这些操作并
不支持 。有关 ALTER TABLE 语句的这些选项的更多信息,请参阅 MODIFY
EXTENT SIZE 子句 和 MODIFY NEXT SIZE 子句。
如果需要修改表的 extent 的大小,您可以在生成的卸装表的模式文件中修改
extent 和下一个 extent 大小。例如,要使数据库更加有效率,您可以卸装一个
表,在模式文件中修改 extent 的大小,接着创建并装入新表。有关如何优化
extent 的信息,请参阅 GBase 8s 管理员指南。
表的 COMPRESSED 选项
当数据加载到表或表分片中时,使用 CREATE TABLE 语句的 COMPRESSED
选项启用自动压缩大量数据行。
在使用 COMPRESSED 选项创建表之后,数据库服务器自动创建压缩自动并压缩
2000 行之后的数据行或更多加载到表中或分片中数据。 如果数据通过轻量级追
加加载,则前 2000 行和所有连续的行都会被压缩。如果数据通过其它方式加
载,则压缩前 2000 行之后的所有连续的行。要压缩初始的 2000 行,请运行带
有 table compress 或 fragment compress 参数的SQL 管理 API task() 或 admin()
函数。
COMPRESSED 选项只对行中的数据启用。 COMPRESSED 选项不会启用
dbspace 或索引中的简单大对象的自动压缩。(您可以使用 CREATE INDEX 语
句的 COMPRESSED 关键字创建一个压缩的 B-tree 索引。)
以下示例创建了一个设置为可以自动压缩的表:
CREATE TABLE cust5 ( ...) COMPRESSED;
以下示例还创建了一个名为 t 的表,并定义其第一个和后续 extent 大小设置为
自动压缩:
CREATE TABLE t(c int, d int) EXTENT SIZE 32 NEXT SIZE 32 COMPRESSED;
要禁用自动压缩新行中数据,请在表上运行带有 table uncompress 参数的 SQL
管理 API task() 或 admin() 函数。您可以使用 fragment uncompress 和 fragment
compress 参数控制表分片的压缩。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 425
延迟 extent 存储分配
如果 IN dbspace 是新表的唯一的存储规范,则会在创建表时为第一个 extent 缺
省分片 16 千字节存储(或者四页面的足够的存储,如果 4 页需要对于 16 千字
节)。
但是,如果 CREATE TABLE 语句不包含以下存储规范,则不会第一个 extent 分
配存储:

EXTENT SIZE

NEXT SIZE

IN dbspace 。
在这种情况中,除非第一行已经存储在表中,否则会延迟第一个 extent 的存储分
配。
相同存储分配延迟适用于通过不包含以上存储规范列表的 CREATE TEMP
TABLE 语句定义的表。
当首次向已延迟 extent 分配的表中插入行时,第一个 extent 的缺省大小为 16
千字节。如果 16 千字节不足 4 个页面,则第一个 extent 大小将会是 4 页。
USING 存取方法子句
USING 存取方法子句可以指定一个存取方法。
USING 存取方法子句

元素
描述
限制
语法
config_keyword
与指定的存取方法关联
的配置关键字
不大于 18 字节,存
取方法必须存在。
文字关键


GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 426
元素
描述
限制
语法
config_value
指定配置关键字的值
不大于 236 字节。必
须由存取方法定义。
引用字符

主存取方法是执行 DDL 和 DML 操作的例程集合,如 create 、drop 、insert 、
delete 、update 和 scan ,使表可供数据库服务器访问。 GBase 8s 提供了一种内
含子的主存取方法。
可以在数据库服务器外的 extspace 或数据库服务器内的 sbspace 中存储并管理虚
拟表。(请参阅 存储选项。)可以使用 SQL 语句存储虚拟表。访问虚拟表需要
用户定义的主要存取方法。
DataBlade 模块可以提供其它主要存储方法来访问虚拟表。访问虚拟表时,数据库
服务器将调用与该存取方法关联的例程而不是内置表例程。有关这些主存取方法
的更多信息,请参阅您的存取方法文档。
您可以使用 MI_TAB_AMPARAM 宏从表描述符中检索存取方法的配置值列表
(mi_am_table_desc)。不是所有的关键字都需要配置值。
存取方法必须已经存在。例如,如果名为 textfile 的存取方法已经存在,则可
以用以下语法来指定:
CREATE TABLE mybook
(... )
IN myextspace
USING textfile (DELIMITER=':');
LOCK MODE 选项
使用 LOCK MODE 选项指定该表的锁定粒度。
LOCK MODE 选项

下表描述了锁定粒度的可用选项。
粒度
作用

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 427
PAGE
在一整页的行上获取并释放一个锁
这是缺省的锁定粒度。当您知道行分组到各页所依照的顺序与
您正在用来处理所有行的顺序相同时,页级别锁定就特别有
用。例如,如果您正在按照表的集群索引的顺序来处理表的内
容时,页锁定将十分使用。
ROW
在每一行上获取并释放一个锁
行级别锁定提供最高级别的并发性。如果同时使用许多行,则
锁定管理开销将变的十分可观。根据您的数据库服务器的配
置,也可以超出可用锁的最大数目。但是 GBase 8s 在 32 为
平台上可支持 180 万个锁,或者在 64 位平台上支持 6000 万
个锁。只有行级别锁定的表才支持 LAST COMMITTED 隔离级别
功能。
接着可用使用 ALTER TABLE ... LOCK MODE 语句更改表的锁定方式。
优先顺序和缺省行为
在 GBase 8s 中,您不需要每次创建新表时都指定锁定方式。您可以在以下环境
中,全局地设定所有新表的锁定粒度:

单用户的数据库会话
可以在当前会话期间,把 IFX_DEF_TABLE_LOCKMODE 环境变量设
置为指定新表的锁定方式。

数据库服务器(数据库服务器上的所有会话)
如果您是一个 DBA ,则可以设置 ONCONFIG 文件中的
DEF_TABLE_LOCKMODE 配置参数,以缺省数据库服务器中所有新表
的锁定方式。
如果您不是 DBA,可以在运行 oninit 之前,设置数据库服务器的
IFX_DEF_TABLE_LOCKMODE 环境变量用来指定数据库服务器中所
有新表的锁定方式。
CREATE TABLE 语句中的 LOCK MODE 设置优先于
IFX_DEF_TABLE_LOCKMODE 环境变量和 DEF_TABLE_LOCKMODE 配置
参数。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 428
如果 CREATE TABLE 未设置锁定方式,则缺省方式将取决于
IFX_DEF_TABLE_LOCKMODE 环境变量或 DEF_TABLE_LOCKMODE 配置
参数的设置。有关 IFX_DEF_TABLE_LOCKMODE 的信息,请参阅 GBase 8s
SQL 参考指南。有关 DEF_TABLE_LOCKMODE 配置参数的信息,请参阅
GBase 8s 管理员参考手册。
AS SELECT 子句
使用 CREATE TABLE 语句的 AS SELECT 子句创建新的表并插入指定查询的结
果集的数据行。
此语法在功能上与 SELECT 语句的 INTO STANDARD 和 INTO RAW 子句 非
常相似。
当您使用 AS SELECT 子句创建新的查询结果表,并使用指定查询返回的限定行填
充该表时,只有 CREATE TABLE 语句语法的以下的子集才有效:

元素
描述
限制
语法
column
查询的 FROM 子句
中的表的列。这将
是结果表中的列
名。
必须在查询结果集中存在 标识符
column_alias
列的别名或显示标
签。声明结果表中
的列名称。
查询的 Projection 子句
中的任何非平凡表达式在
结果表中需要其列名的别
名或显示标签
标识符

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 429
元素
描述
限制
语法
table
此处为结果表声明
的名称
在数据库中表、同义词、
视图和序列名称中必须是
唯一的。
标识符
target_data_typ
e
显式强制转型返回
的数据类型。它将
会是结果表中列的
数据类型。
请参阅 对于目标数据类型
的规则
数据类

用法
当使用 CREATE TABLE . . . AS SELECT 语句创建新的永久表来存储查询的结果
时,您可以指定该表的日志记录方式为 STANDARD 或 RAW 。如果您都忽略
了这些关键字,则缺省为 STANDARD 。
您还可以可选地为此查询结果表指定下列属性:

独立存储位置,或者分布存储方案e

它的第一个 extent 和下一个 extent 的存储大小

它的 PAGE 或 ROW 锁定粒度
如果您省略了存储或锁定规范,则数据库服务器使用缺省值。
如果在数据库服务器向该表填充大量 AS SELECT 子句中查询返回的行时发生了
错误,则该操作会回滚,且不会创建或填充新表。
出现在 AS SELECT 子句的 Projection 列表中的列可以来自任何本地表、视图或
来自远程数据库(必须在限定的表名中引用),但是新表必须在本地数据库中创
建。
在 grid 环境中,如果 AS SELECT 子句的 FROM 子句中的表与所有参与的指定
的 grid 或地区的数据库服务器具有相同的结构,则您可以包含 AS SELECT 子
句以从grid 查询创建表。
结果表中列的名称
缺省情况下,新永久表中的列名称是在 Projection 子句的 SELECT 列表中指定
的名称。如果星号(*)是 Projection 子句的 SELECT 列表,则星号将扩展为

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 430
SELECT 语句的 FROM 子句中对应的表或视图中的所有列名。由 FROM 子句
指定表对象中的任何显式或隐式影子列不会由星号规范扩展。
在实现 Enterprise Replication 的系统上,可以使用 ALTER TABLE 语句的 ADD
CRCOLS 、ADD REPLCHECK 和 ADD ERKEY 选项将相应的影子列添加到 AS
SELECT 子句创建的结果表中。
除了简单列表达式之外, Projection 子句的 SELECT 列表中所有表达式都必须
具有显示标签(也称为 列别名)。这用作新查询结果表中相应列的标识符。如果
列表达式没有显示标签,则结果表使用查询的 FROM 子句中的源表中的列名。
在 CREATE TABLE . . . AS SELECT 语句中,可以使用以下两种方法指定列别
名:

作为逗号分隔的别名列表,紧跟在 TABLE 关键字后面,类似于
INSERT INTO . . . SELECT FROM 语句

作为 Projection 子句中 SELECT 列表的一部分,与结构表中的
SELECT . . . INTO STANDARD 或 SELECT . . . INTO RAW 语句可以创

如果在 CREATE TABLE . . . AS SELECT 语句中存在 Projection 子句的 SELECT
列表和 TABLE 关键字后面的逗号分隔的别名列表,则列别名的逗号分隔列表优
先。在这种情况下,将忽略在 AS SELECT 子句中声明的任何列别名。
在以下情况中 CREATE TABLE . . . AS SELECT 语句会发生错误并失败:

I 如果未为非重要列表达式声明显示标签或列别名。

如果显示标签或列名称与新结果表中的另一列具有相同的名称。

除了存储选项和 LOCK MODE 属性之外,CREATE TABLE . . . AS
SELECT 语句不能为新表的列定义约束或任何其它特殊属性。

如果逗号分隔的别名列表位于 TABLE 关键字之后,但该列表的别名数
量少于 Projection 子句的 SELECT 列表中的表达式数量。
但是,如果 TABLE 关键字后面的列别名列表具有比 Projection 子句的 SELECT
列表更多的项目,在这种情况下,数据库服务器将忽略过多的列别名,并且不会
发生异常。
支持的数据类型

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 431
CREATE TABLE . . . AS SELECT 已经支持用户定义的数据类型和所有内置的
GBase 8s 数据类型。
但是,在新的结果表中只允许有一个序列列。在包含了第一个 SERIAL 、
SERIAL8 或 BIGSERIAL 类型的列后,所有随后的 SERIAL 、SERIAL8 或
BIGSERIAL 列作为 INTEGER 、INTEGER8 或 BIGINTEGER 列创建。
结果表上的限制
与大多数 DDL 语句一样,使用完全限定表名在其它数据库中创建新结果表的尝
试会失败,并显示语法错误。类似地,创建于现有表具有相同名称的结果表是一
个错误,除非 AS SELECT 子句包含 IF NOT EXISTS 关键字。 SELECT 语句
的 SELECT INTO . . . TABLE 语法作为子查询的一部分时是无效的。
AS SELECT 子句可以包含在 ORDER BY 子句中而不在 Projection 子句的
SELECT 列表中的列。
IF NOT EXISTS 关键字
如果您在 AS SELECT 子句中为查询结果表声明的名称在数据库的永久表、同义
词、视图和序列的名称中是唯一的,则无论 AS SELECT 子句是否包含 IF NOT
EXISTS 关键字,数据库服务器总会创建查询结果表并填充所有查询返回的行。
(如果查询没有返回行,则该结果表为空,但是它的结构已经在数据库的系统目
录中注册,并作为一个新的永久表存在。)
如果 AS SELECT 子句包含了 IF NOT EXISTS 关键字,但您为结果表声明的名称
在数据库的永久表的名称中并不是唯一的,则不会执行该 AS SELECT 子句定义的
查询,并且数据库服务器返回以下消息:
0 row(s) retrieved into table.
如果 AS SELECT 子句忽略了 IF NOT EXISTS 关键字,且您为查询结果表声
明的名称在数据库的永久表的名称中并不是唯一的,则不会创建结果表,并且数
据库服务器返回一个错误。
创建和填充结果表的示例
以下示例创建了一个名为 rtabl 的新 RAW 表,用此表来存储连接查询的结果:
CREATE RAW TABLE IF NOT EXISTS rtab1
AS

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 432
SELECT t1col1, t1col2, t2col1
FROM tab1, tab2
WHERE t1col1 < 100 and t2col1 > 5;
在以上示例中,新的查询结果表 rtab1 将包含列 t1col1 、t1col2 和 t2col1 。
下一个示例发生错误 -249 并失败,因为它没有为 col1+5 列表达式声明显示标
签:
CREATE TABLE IF NOT EXISTS qtab1
AS
SELECT col1+5, col2
FROM tab1;
通过在包含 + 运算符的 Projection 子句中为列表表达式声明列别名 qcol1,以下
修订的查询避免了之前示例返回的 -249 错误:
CREATE TABLE IF NOT EXISTS qtab1 (qcol1, col2)
AS
SELECT col1+5, col2
FROM tab1;
以上正确的示例创建了标准表 qtabl 来存储 AS SELECT 子句的查询结果。
下一示例使用不同但等价的语句来在 AS SELECT 子句中声明相同的 qcol1 别
名,而不是在列别名列表中声明:
CREATE TABLE IF NOT EXISTS qtab1
AS
SELECT col1+5 qcol1, col2
FROM tab1;
以上的 CREATE TABLE 语句同样避免了 -249 错误,并创建结果和数据内容与
前面示例中 qtabl 表相同的结果表。这这些示例中,结果表都有两列, qcol1 和
col2 。如果 col1 是 INTEGER 类型,则 qcol1 将是 DECIMAL 类型,返回的
数据类型来自 col1+5 表达式。
如语法图所示,CREATE TABLE 语句的 Storage 和 Lock Mode 选项对 AS
SELECT 子句有效。以下示例使用 FRAGMENT BY EXPRESSION 关键字为查询
结果表定义分布存储策略,其中 fcol1 列别名是分片键,ROW 是锁定粒度:
CREATE TABLE IF NOT EXISTS permtab (fcol1, col2)
FRAGMENT BY EXPRESSION

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 433
fcol1 < 300 IN dbs1,
fcol1 >=300 IN dbs2
LOCK MODE ROW
AS SELECT col1::FLOAT, col2
FROM tab1;
任何 fcol1 值低于 300 的行会插入到 dbspace dbs1 中。具有较大 fcol1 值的行
会存储在 dbs2 dbspace 中。
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 行的查询。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 434
当创建类型表时,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 子句来指示继承(即,将表定义为子表)。子表从它上面的超级表
那里继承属性。此外,您还可以为子表定义新属性。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 435
继续 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.

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 436
表上的存取特权
表上的特权描述了谁可以存取表中的信息以及谁可以创建新表。有关存取特权的
更多信息,请参阅 GRANT 语句 章节的描述。
在兼容 ANSI 的数据库中,不存在缺省的表级特权。必须显式地授权这些特权。
将 NODEFDAC 环境变量设置为 yes 以防止缺省的特权授予不兼容 ANSI 的
数据库的新表中的 PUBLIC ,正如 GBase 8s SQL 参考指南 中描述的那样。有
关特权的更多信息,请参阅 GBase 8s SQL 教程指南。
系统目录信息
当您创建表时,数据库服务器将每个表的基础信息添加到 systables 系统目录
表,并将列信息添加到 syscolumns 系统目录表。sysfragments 系统目录表包含
关于分片存储策略和表分片位置的信息。sysblobs 系统目录表中包含 dbspace 和
简单大对象的位置信息。(sysmaster 数据库中的 syschunks 表包含智能大对象
的位置信息。)
systabauth 、syscolauth 、sysfragauth 、sysprocauth 、sysusers 和
sysxtdtypeauth 表包含不同的 CREATE TABLE 选项所需要的特权。
sysextcols 、sysextdfiles 和 sysexternal 表包含有关 CREATE EXTERNAL
TABLE 语句注册于数据库中对象的其它信息。
systables 、sysxtdtypes 和 sysinherits 系统目录表提供类型表的信息。系统目录中
将记录类型表层次结构、约束、索引和触发器,但不记录继承它们的子表。但
是,会为超级表和子表记录分片存储信息。有关继承的更多信息,请参阅 GBase
8s SQL 教程指南。