返回首页

gbase数据、南大通用产品文档:GBase8a自增列

更新日期:2024年09月11日

功能描述
自增列是指定auto_increment 属性的列,自增列的列值单调递增(不保证连续)。
自增列支持在以下数据类型的列上使用:tinyint、smallint、int、bigint。自增列可
以唯一识别表中每一条记录,可方便用于查询、修改、删除等操作。
说明

每个表只能有一个自增列,且自增列支持的数据类型只能是
tinyint、smallint、int、bigint;

集群的自增列由系统自动维护,
用户不可指定自增起始值和自增
步长,集群的自增值单调递增,不保证连续;

在集群哈希分布表中,自增列不能作为哈希分布列;

分区表中,自增列不能作为分区条件列。

默认不允许DML 操作自增列,即:

insert 不能显式插入数据(因为大数据量情况下逐条检查插入
数据和已有数据是否唯一递增会严重影响性能);

可以给自增列insert 指定特定值NULL、0、
default,
指定这三
个值不影响自增列,自增列仍然保持系统自动递增维护的值;

update 不能更新自增列;

merge 不能update/insert 自增列。

若要允许
DML
操作自增列,需要设置
_gbase_auto_increment_allow_insert=1,
此时需要用户自己保证自增
列值是否正确;

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
1007

操作场景
使用多VC 模式。

GBase 8a MPP Cluster 产品手册
3 集群安装升级与卸载
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
78
前提条件
集群运行正常;
root cluster 中存在freenode;
gcadmin 可用。
操作步骤
步骤1
切换到dbaUser 用户(即demo.options 中的dbaUser 用户),进入安装包解压后的
gcinstall 目录下。
# su - gbase
$ cd /opt/gcinstall
步骤2
生成创建VC1 的配置示范文件示例,由以下命令生成。
$ gcadmin createvc e example_file_name
其中:example_file_name 为生成的文件,文件名可以任意,如:create_vc.xml。
生成的配置文件命令参考如下:
$ gcadmin createvc e create_vc1.xml
$ cat create_vc1.xml











GBase 8a MPP Cluster 产品手册
3 集群安装升级与卸载
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
79
说明

vc_name 不能超过64 个字节,comment 信息不能超过60 个字节;

创建VC 的配置文件中的node ip 为Free node 的IP,
多个VC 间不能共享;
步骤3
编辑创建VC1 的配置文件。
示例:编辑create_vc1.xml 内容如下:
$ vi create_vc1.xml











(:wq 保存退出)
步骤4
执行创建命令。
$ gcadmin createvc create_vc1.xml
执行结果如下:
$ gcadmin createvc create_vc1.xml
parse config file create_vc1.xml
generate vc id: vc00001
add vc information to cluster
add nodes to vc
gcadmin create vc [vc1] successful

GBase 8a MPP Cluster 产品手册
3 集群安装升级与卸载
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
80

使用 ALTER TABLE 语句修改现有表的结构。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 117
(要修改表的存储分布策略,您必须使用 ALTER FRAGMENT 语句而不是
ALTER TABLE 语句。)
语法

基本表选项

元素
描述
限制
语法
synonym 要更改的表的同义词 同义词及其表必须存在;
USETABLENAME 必须未设置
标识符
table
要更改的表的名称
在当前数据库中必须存在
标识符

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 118
语法
GBase 8s 数据库服务器按您在 ALTER TABLE 语句中指定的顺序执行操作。如
果任一操作失败,那么整个操作将被取消。
ALTER TABLE 语句不能向一个未分片表中添加分片存储策略,也不能修改分片
表的存储分片策略。有关添加、修改或删除表的分片存储策略的信息,请参阅
ALTER FRAGMENT 语句 。
更改视图依赖的表可能会使得视图无效。
警告: 此语句可用的子句对性能的影响各不相同。采取更改操作之前,请检查
GBase 8s 性能指南 中 更改表定义 中相应章节来检查影响和策略。
您可以使用 Basic Table Options 段修改表的结构,方法是添加、修改或删除列和
约束,或更改 extent 大小或锁定表的粒度。数据库服务器按您指定的顺序执行更
改。如果任一动作失败,那么整个操作将会取消。
在 GBase 8s ,您可以将表与已命名的 ROW 类型关联,或指定新的存储空间以
存储大对象数据。您也可以添加或删除 rowid 列或隐藏列以支持辅助服务器更新
USELASTCOMMITTED 功能的操作。然而,您不能与其他任何更改一起指定这
些选项。
Logging TYPE 选项
使用 Logging TYPE 选项指定该表具有特殊特性,以提高对它的各种批量操作。
Logging TYPE 选项

这里 STANDARD ,CREATE TABLE 语句的缺省选项 ,指定日志记录表,
RAW 指定非日志记录表。
表可具有以下日志记录特性。
选项 作用

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 119
STANDARD 日志记录表允许回滚、还原和从归档恢复。这是缺省值。
OLTP 数据库使用这种类型的还原和限制功能。
RAW 非日志记录表不支持主键约束、唯一约束或参考约束。
RAW 表可拥有 NOT NULL 约束和 NULL 约束(但不能将这两个约束设置在同
一列)。它们可以被索引和更新。使用这种类型以快速加载数据。
Warning: 使用 RAW 表以快速加载数据。建议您在事务中使用此表前或更改表中
的数据前,将日志记录类型更改为 STANDARD 并执行零级备份。如果您必须在事
务中使用 RAW 表,则将其设置为 Repeatable Read 隔离级别或者以互斥方式锁
定该表以防止并发问题。
该 Logging TYPE 选项可以将非日志记录表(例如: RAW 表)转换为
STANDARD 表,以支持事务日志记录。如果使用此功能,您必须注意数据库服
务器没有检查该表上是否在执行一个零级归档。
RAW 表上的操作不会被日志记录及恢复,因此 RAW 表一直处于风险中。当数
据库服务器将一个非日志记录的表转换为一个 STANDARD 表类型时,您有责在
事务使用此表前或更新表中数据时,执行零级备份。否则,执行失败可能引起在
服务器崩溃的事件中的还原问题。
有关表的日志记录类型的更多信息,请参阅 GBase 8s 管理员指南。
该 Logging TYPE 选项具有以下限制:

在此日志记录表从其它日志记录类别变更为 STANDARD 之前,您必须
执行零级归档。

该表不能是 TEMP 表,并且您不能将表的任一这些类型的变更为一个
TEMP 表。
以下示例将一个非日志记录表更改为一个使用事务日志记录的表:
ALTER TABLE tabnolog TYPE (STANDARD);
以下示例将一个日志记录表更改为非日志记录表:
ALTER TABLE tablog TYPE (RAW);

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 120
ALTER TABLE 语句的 Statistics 选项
使用 ALTER TABLE 语句的 Statistics Options 子句更改分片表或未分片表的
STATCHANGE 属性的值,和分片表的 STATLEVEL 属性的值。这些表属性控
制重新计算的阈值和数据分布统计信息的粒度。
语法

该子句支持与 CREATE TABLE 语句的 Statistics 选项相同的语法。
元素
描述
限制
语法
change_
threshold
定义过时的分布统计信
息的已更改数据的百分

必须是在 0 - 100 内的
整数
精确数值
用法
Statistics 选项子句可修改表的统计属性以允许用户控制 UPDATE STATISTICS
操作(当此 SQL 语句在一个分片表上以 LOW 、MEDIUM 或 HIGH 的方式运
行时)。 ALTER TABLE 语句可以修改这些属性的指定的或缺省值(这些值在表
创建时设置或者它们是由之前的 ALTER TABLE 语句设置的)。
Statistics 选项子句可将这两个表的属性设置为 STATCHANGE 和
STATLEVEL:
STATCHANGE 表指定需要考虑统计过时的更改的最小百分比(从该表中行的
UPDATE 、DELETE 和 INSERT 操作或从上次计算分布统计信息的分片)。您
可以指定 0 - 100 内的整数作为更改的百分比,或使用 AUTO 关键字应用在
ONCOFIG 文件或会话环境中的当前的 STATCHANGE 配置参数作为缺省的更改
的阈值。
UPDATE STATISTICS 语句的 AUTO 关键字也能启用比较用 STATCHANGE 已
更改的设置值确定系统目录中的`统计信息是否过时的行的比例。包含 AUTO 关

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 121
键字的UPDATE STATISTICS 语句只在当前的 UPDATE STATISTICS 操作期间
启动旧的统计的检查(并只选择性地更新过时或丢失统计信息的表或分片)。
当 AUTO_STAT_MODE 配置参数或 AUTO_STAT_MODE 会话环境变量启用了
自动方式,UPDATE STATISTICS 语句使用显式或缺省的 STATCHANGE 值辨
别表、索引或统计信息丢失或过时的分片存储策略,并只更改丢失的或过时的统
计信息。有关 UPDATE STATISTICS 操作的自动方式的信息,请参阅 GBase 8s
管理员参考 中有关 AUTO_STAT_MODE 的信息。
STATLEVEL 属性可决定数据分布粒度的级别和分片表的索引统计信息。它可以采
用其中以下三个值之一(如果在创建的时候它没有值,则可使用 AUTO 作为缺省
值):

TABLE 指定的该表的所有分布存储以表级别创建。

FRAGMENT 指定的分布是创建和维护每个分片。

AUTO 指定数据库服务器在运行时决定分片级别分布是否重要的标准。
这些标准需要需要以下条件为真:
o
SYSSBSPACENAME 配置参数设置指定了一个现有的 sbspace
o
该表按 EXPRESSION 、INTERVAL 、Rolling Window 、或
LIST 策略分片
o
该表有超过100 万行
如果任何一种标准没有满足,那么数据库服务器创建表级别分布而不是分
片级别分布。
会经常应用这些属性。如果该 STATLEVEL 设置为 AUTO ,则此设置会重写缺
省值。
注: 当初始化数据库服务器时,必须设置 SYSSBSPACENAME 配置参数,指定数据
库服务器存储分片级别数据分布统计信息的 sbspace 。它们作为存储在
syfragsdist 系统目录表的 encdist 列中 BLOB 对象。为了使数据库服务器支持
分配级别统计信息,SYSSBSPACENAME 配置参数设置必须指定一个现有的
sbspace 。
如果您使用 Statistics 选项子句将 STATLEVEL 属性设置为 FRAGMENT ,且以下
条件之一为真时,数据库服务器返回错误 -9814("Invalid default sbspace
name"):

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

未设置 SYSSBSPACENAME 配置参数

按 onspaces -c -S 命令分配给 SYSSBSPACENAME 指定的 sbspace 不合

更改 STATLEVEL 的示例
假设表 tabFrag 使用分片分布存储策略而不是 ROUND ROBIN ,且它包含一个
名为 smartblob 的 BLOB 或 CLOB 列。决定保持该存储分布策略,但是使用
TABLE 而不是 FRAGMENT 作为 STATLEVEL 粒度。以下 SQL 语句引用了
tabFrag 表并拥有下列成功的作用:

将 STATLEVEL 更改为 TABLE ,通过使用 ALTER TABLE 的
Statistics 选项子句。

通过使用 UPDATE STATISTICS LOW 丢弃在 sysfragdist 系统目录表中
tabFrag.smartblob 的当前分片级别分布。

通过使用 UPDATE STATISTICS HIGH 为 sysdistrib 系统目标表中的
tabFrag 创建新的表级别统计信息。
ALTER TABLE tabFrag STATLEVEL TABLE;

UPDATE STATISTICS LOW
FOR TABLE tabFrag (smartblob) DROP DISTRIBUTIONS

UPDATE STATISTICS HIGH
FOR TABLE tabFrag (smartblob);
以上最后一条语句,缺省的 0.5 HIGH 决议意味着 tabFrag.smartblob 分布统
计信息基于近似 200 bins 。
表的限制
跟随在 ALTER TABLE 关键字之后的表名或同义词的表必须是当前数据库中的常
驻表。它具有以下限制:

不能是临时表。

不能是不是当前数据库中的表。

不能是 CREATE EXTERNAL TABLE 语句定义的表对象。

不能是违例表或诊断表。
此外,您不能用 ALTER TABLE 语句进行以下操作:

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

添加、删除或修改与违规表或诊断表关联的表中列。

在 RAW 表上定义引用约束或唯一约束。

在列或列的集合上定义 将列作为索引键的限制 冲突的索引。
如果已设置了 USETABLENAME 环境变量,那么您就不能在 ALTER TABLE 语
句中指定表的 synonym 。
要使用 ALTER TABLE ,您的存取权限必须至少满足以下条件之一:

必须在包含该表的数据库上拥有 DBA 权限。

必须拥有该表。

必须拥有指定表上的 Alter 权限并在表驻留的数据库上拥有 Resource 权
限。

要添加引用约束,必须在引用列或引用表上拥有 DBA 权限或 References
权限。

要删除约束,必须拥有 DBA 权限或是约束的所有者。如果是约束的所有
者但不是表的所有者,必须在指定的表上拥有 Alter 权限。您不需要
References 权限就能删除约束。
Enterprise Replication 阴影列
当您更改表时,可以添加或删除 Enterprise Replication 阴影列。
添加或删除 Enterprise Replication 阴影列

语法
如果当您正在使用 ADD CRCOLS 、ADD REPLCHECK 或 ADD ERKEY 关键
字更改表时 Enterprise Replication 是活动的,则您必须用 cdr alter 命令将该表处
于更改模式。
Enterprise Replication 使用 ADD CRCOLS 关键字创建阴影列(cdrserver 和
cdrtime)以解决冲突。如果该表的任一列的数据类型需要缓慢更改,那么更改此
表以添加 CRCOLS 阴影列会是一种缓慢的更改操作。缓慢更改操作需要的磁盘

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 124
空间至少是初始表加日志空间的两倍。有关应用 ALTER TABLE 语句性能的信
息,请参阅Altering a table definition。
使用 DROP CRCOLS 关键字删除 cdrserver 和 cdrtime 阴影列。您必须在删除
cdrserver 和 cdrtime 阴影列之前停止复制。
ADD REPLCHECK 关键字创建此阴影列(ifx_replcheck),您可以在此列创建一
个索引与主键 ,以加速 Enterprise Replication 的一致性检查的过程。向表中添加
ifx_replcheck 阴影列是一个缓慢的更改操作,它所需要的磁盘空间至少是初始表
加日志空间的两倍。
使用 DROP REPLCHECK 关键字删除 ifx_replcheck 阴影列。
Enterprise Replication 使用 ADD ERKEY 关键字创建阴影列 ifx_erkey_1 、
ifx_erkey_2 和 ifx_erkey_3(代理主键)。 更改表以添加 ERKEY 阴影列是一
个缓慢的更改操作。
使用 DROP ERKEY 关键字删除 ifx_erkey_1 、ifx_erkey_2 和 ifx_erkey_3 阴影
列。
有关更多信息,请参阅使用 WITH CRCOLS 选项、使用 WITH REPLCHECK 关
键字、使用 WITH ERKEY 关键字和 GBase 8s Enterprise Replication 指南 。
示例
以下示例中,往customer 表中添加了 cdrserver 和 cdrtime 阴影列:
ALTER TABLE customer ADD CRCOLS;
以下示例中,往 customer 表中添加了阴影列 ifx_replcheck:
ALTER TABLE customer ADD REPLCHECK;
以下示例删除了 customer 表的 ifx_replcheck 列:
ALTER TABLE customer DROP REPLCHECK;
以下示例往 customer 表中添加了ifx_erkey_1 、ifx_erkey_2 和
ifx_erkey_3 列:
ALTER TABLE customer ADD ERKEY;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 125
使用 ADD ROWIDS 关键字
使用 ADD ROWIDS 关键字将名为 rowid 的新列添加至已分片的表。(缺省情
况下,已分片的表不包含隐藏的 rowid 列。)当添加 rowid 列时,数据库服务
器为每个在存续期间保持稳定的行分配一个唯一号码。数据库服务器创建一个它
用来查找行的物理位置的索引。添加 rowid 列后,表的每一行包含了另外 4 个
字节来存储 rowid 值。
以下示例使用 ADD ROWIDS 选项向分片表 frag1 中添加了一个 INTEGER 类型的
新 rowid 列:
ALTER TABLE frag1 ADD ROWIDS;
提示: 仅对分片表使用 ADD ROWIDS 子句。在非分片表中,rowid 列保持不变。
建议将主键用作存取方法而不是利用 rowid 列。
有关 rowid 列的其它信息,请参阅 GBase 8s 管理员参考手册 。
使用 DROP ROWIDS 关键字
DROP ROWIDS 关键字可删除您添加(用 ALTER TABLE 或 ALTER
FRAGMENT 语句)到分片表上的 rowid 列。
以下示例删除了 frag1 表的 rowid 列:
ALTER TABLE frag1 DROP RWIDS;
您无法删除未分片表的 rowid 列。
使用 ADD VERCOLS 关键字
ADD VERCOLS 关键字创建用于支持复制服务器更新的阴影列
ifx_insert_checksum 和 ifx_row_version。
在以下示例中,向 customer 表中添加了 ifx_insert_checksum 和
ifx_row_version 阴影列:
ALTER TABLE customer ADD VERCOLS;
修改表以添加新的版本控制列是一种快速更改操作。
有关更多信息,请参阅使用 WITH VERCOLS 选项和 GBase 8s 管理员指南 。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 126
使用 DROP VERCOLS 关键字
使用 DROP VERCOLS 关键字删除 ifx_insert_checksum 和 ifx_row_version 阴
影列。
以下示例删除了 customer 表的这些阴影列:
ALTER TABLE customer DROP VERCOLS;
ADD Column 子句
使用 ADD Column 子句向表添加列或安全策略。
ADD Column 子句

New Column

元素
描述
限制
语法
column
要在前面放置
new_column 的列的名称
必须已经在表中存在
标识符
new_column 正在添加的列的名称
如果表包含数据,则无法
添加连续列
标识符
以下限制应用于 ADD 子句:

不能向包含数据的表添加顺序列。

Y 不可用添加超过最大行大小 32,767 字节的列。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 127
以下限制影响了 ADD Column 子句添加 IDSSECURITYLABEL 数据类型的列以支持
基于标签的存取控制的使用:

如果该表没有安全策略,持有 DBSECADM 角色的用户必须也包含
ADD SECURITY POLICY 语句指定一个现有的安全策略。

只有持有 DBSECADM 角色的用户才能添加 IDSSECURITYLABEL 类
型的列。

一个表最多可拥有一个 IDSSECURITYLABEL 类型的列。

IDSSECURITYLABEL 列不能持有列保护。

IDSSECURITYLABEL 列缺省情况下具有隐式 NOT NULL 约束。如果
DEFAULT 子句中没有指定缺省的安全标签 label 的名称,那么该列的缺
省值是该用户持有的写入存取的安全标签。

IDSSECURITY LABEL 列不能拥有任何显式单独列约束,而且它不能是
多列引用或检查约束的一部分。
字符列中支持的逻辑字符
对于您声明作为内置字符数据类型的新列,显式或缺省大小规格以字节为单位阐
述,除非 SQL_LOGICAL_CHAR 配置参数已经为当前数据库启用逻辑字符语义。设
计此功能的目的是降低在本地语言环境中调整数据字符串的风险,并支持多字符
代码设置,例如:UTF-8。启用此功能会导致 SQL 语法分析器以逻辑字符而不是
字节作为单位来解释声明的列大小,此功能声明的存储大小由一个正整数值,基
于 SQL_LOGICAL_CHAR 设置分配新的字符列的倍数。

如果此设置的值为 OFF 或 1 ,那么 SQL_LOGICAL_CHAR 配置参数
没有影响。

如果该值设置为 ON ,而不是一个数字,该扩充因素是存储数据库代码
集中最大逻辑字符所需的字节数。(设置 ON 相当于 4 ,是最大的有效
数。)
该扩充因素的值是数据库的属性,其基于创建数据库时的 QL_LOGICAL_CHAR
设置而不是由 ALTER TABLE 语句声明(如果这两个设置不同)。
当启用此功能时,声明其为 VARCHAR 或 NCHAR 数据类型,只有最大大小规
格由此功能扩展。保留的大小是由数据类型声明中的显示或缺省的 reserved 值指
定的字节数,因为逻辑字符的最小大小为 1 字节。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 128
用户定义的字符列类型的大小规范(UDTs)通常解释为字节并不会被此功能影
响。存储字符串作为大对象的列(例如:CLOB 和 TEXT),同样不受影响。
有关 SQL_LOGICAL_CHAR 配置参数的更多信息,请参阅 GBase 8s 管理员参
考手册。有关多字节语言环境和逻辑符号的其它信息,请参阅 GBase 8s GLS 用
户指南 。
BEFORE 子句
该可选的 BEFORE 子句决定在表结构中新的列的最初位置,通过在 ALTER
TABLE ADD 语句插入新列之前 ,指定现有列的名称。
在以下示例中,BEFORE 选项引导数据库服务器在 total_price 列之前添加
item_weight 列:
ALTER TABLE items
ADD (item_weight DECIMAL(6,2) NOT NULL BEFORE total_price);
如果没有包含 BEFORE 子句,则缺省情况下数据库服务器将新的列添加到当前
表结构的最后一列的末尾,以 ADD 子句中的词法顺序。
DEFAULT 子句
使用 DEFAULT 子句指定当列的显式值没有指定时,数据库服务器应当在该列中插
入的值。
DEFAULT 子句


GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 129
元素
描述
限制
语法
label
安全标签的名

必须存在且必须属于保护此表的安全策
略。该列必须是 IDSSECURITYLABEL 类
型。
标识符
literal 列的文字缺省

必须适合列的数据类型。请参阅将文字值
作为缺省值
标识符
如果当您添加包含缺省值的列时,您正在更改的表已经有行,则此缺省值只应用
在 ALTER TABLE MODIFY 语句之后插入的新列的行中。任何新列插入之前已
存在的行,会在新列中拥有一个 NULL 值,除非您更改这些行以插入非 NULL
值。现在您插入的行将拥有 MODIFY 子句指定的缺省值,除非您向新列中插入
了其它值。
你不能指定顺序列的缺省值。 对于 DISTINCT 或 OPAQUE 数据类型的列,您
不能指定作为缺省值像变量函数的常数表达式(例如:CURRENT 、SYSDATE
DBSERVERNAME 、SITENAME 、TODAY 、USER 或 CURRENT_USER)。
以下示例将数据类型为 DECIMAL(6,2) 的列添加到 items 表。在 items 中,新
的列 item_weight 有文字缺省值:
ALTER TABLE items
ADD item_weight DECIMAL (6, 2) DEFAULT 2.00
BEFORE total_price;
在此示例中,items 表中的每个现有行的 item_weight 列都有缺省值 2.00 。
有关 DEFAULT 子句的选项的更多信息,请参阅 CREATE TABLE 语句中
DEFAULT 子句 章节。
DEFAULT 标签
当 DBSECADM 向由安全策略保护的表添加 IDSSECURITYLABEL 列时,需要
DEFAULT label 规范,除非该表为空。如果表不为空,那么指定的 label 会插入
到表的现有行中。
如果 DEFAULT 子句我数据类型不是 IDSSECURITYLABEL 的列指定安全标
签,或者如果表没有安全策略,或者如果该标签的安全策略不是该表的安全策
略,那么会发出错误。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 130
要定义指定的 label 为 IDSSECURITYLABEL 列的缺省值,指定不带 policy 限
定符的 label 名称,而不是 policy.label,因为该表的安全策略只对表中保护数据
的安全标签是有效策略。
以下示例中的语句向表 T1 中添加安全策略标签 MegaCorp,并通过声明新列 D
为 IDSSECURITYLABEL 类型(其缺省值是名为 mylabel 的安全标签)来为表指定
列级别保护:
ALTER TABLE T1
ADD (D IDSSECURITYLABEL DEFAULT mylabel1)
ADD SECURITY POLICY MegaCorp;
因为不包含 BEFORE 子句,列 D 是表 T1 结构中的最后一列。如果它引用的数据
库对象在当前数据库中不存在(除了新列 D),则该语句失败。
单列约束格式
使用单列约束格式将一个或多个约束与单列关联。
单列约束格式

如果表包含数据,则您不能在新列上指定主键或唯一约束。然而在唯一约束的情
况下,表可以包含单行的数据。如果希望添加带有主键约束的列,则发出 ALTER
TABLE 语句时表必须为空。
当在现有列上放置主键或者唯一约束时,应用以下规则:

当您在一列或一组列上放置主键或唯一约束时,数据库服务器在受约束的
列或一组列上创建内部 B-tree 索引,并且自动计算列统计信息,相当于

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 131
UPDATE STATISTICS 语句在 HIGH 模式下创建分布。除非在该列或该
组列上定义了用户创建的索引。

如果在一列或一组列上放置主键或唯一约束,而且该列或该组列上已存在
唯一索引,则约束共享该索引。然而如果现有索引允许复制,则数据库服
务器返回错误。那么您必须在添加约束之前删除现有索引。

如果在一列或一组列上放置主键或唯一约束,并且该列或该组列上已存在
引用约束,则重复索引升级为 UNIQUE (如果可能的话),并且该索引
被共享。
不能在 BYTE 或 TEXT 列上放置唯一约束,也不能在这些数据类型的列上放置
引用约束。 BYTE 或 TEXT 列上的检查约束可只能用于检查 IS NULL 、IS
NOT NULL 或 LENGTH。
如果在同一列上指定 NOT NULL 约束和 NULL 约束,则该语句失败。不能在数
据类型是 LIST 、MULTISET 、SET 或 IDSSECURITYLABEL 的列上定义
NULL 约束。
IDSSECURITYLABEL 列具有隐式 NOT NULL 约束,但是它不能具有显式单列
约束也不能是多列引用约束或检查约束的一部分。如果约束在存储加密数据的列
上,那么 GBase 8s 不能强制执行此约束。
重要: 不能使用单列约束格式在 ENABLED NOVALIDATE 或 FILTERING
WITH ERROR NOVALIDATE 或 FILTERING WITHOUT ERROR NOVALIDATE
约束模式中添加外键约束的新列。对于 ALTER TABLE 语句在 ALTER TABLE
操作期间使用 NOVALIDATE 关键字绕过违规检查来创建新的外键约束,必须使
用具有多列约束格式的 ALTER TABLE ADD CONSTRAINT 语法。
ADD COLUMN 使用 NOT NULL 约束
当您添加一个 NOT NULL 约束的列时,如果表中含有数据,则您必须包含
DEFAULT 子句。
然而,如果表为空,您可以添加列并只应用 NOT NULL 约束。无论该表是否包含
数据,以下示例语句都有效:
ALTER TABLE items
ADD (item_weight DECIMAL(6,2)
DEFAULT 2.0 NOT NULL
BEFORE total_price);

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 132
约束定义
使用 ALTER TABLE 语句中的约束定义部分来声明约束的名称并将约束方式设置
为 DISABLED 或 ENABLED ,或者对于包含隔离表的表,设置为两个
FILTERING 方式。
对于启用或过滤 ALTER TABLE ADD CONSTRAINT 语句可以创建的外键约束,
NOVALIDATE 方式可以在数据库服务器在创建此约束时,防止其检查该表的每
一行是否符合启用约束。
单列约束格式和多列约束格式都支持以下定义约束的语法:
约束定义

元素
描述
限制
语法
constraint 在此为约束声明的名称
在数据库中的索引和约束
名称中必须唯一
标识

用法
如果此 ALTER TABLE 语句包含单个列约束格式或多列约束格式,但是约束定义
为空,则数据库服务器创建并启用指定任意类型的单列约束格式或多列约束格
式,给此约束分配一个系统生成的标识符和一个缺省对象状态,并将这些属性注
册到 sysconstraints 和 sysobjstate 系统目录表中。
如果您未为此约束指定方式,那么约束使用缺省的方式。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 133
可选的 ON DELETE CASCADE 关键字可以在该约束名称之前或之后。对于引用
约束,ON DELETE CASCADE 关键字指示数据库服务器在删除父表中具有关联的
主键的行时,删除子表中具有外键的行。有关 DELETE 操作上这些关键字的影
响的更多信息,请参阅使用 ON DELETE CASCADE 选项 。
当创建 ALTER TABLE ADD CONSTRAINT 语句定义的外键约束时,
NOVALIDATE 关键字防止数据库服务器在运行 ALTER TABLE 语句时检查该表
的每一行是否符合启用约束。有关此关键字的限制和影响的更多信息,请参阅在
NOVALIDATE 方式下创建外键约束。
在 CREATE TABLE 语句中,您不能在 BYTE 或 TEXT 列上定义唯一约束、主
键约束或引用约束。此外,该表不能是 RAW 表。
有关约束方式选项的更多信息,请参阅选择约束方式选项。
REFERENCES 子句
REFERENCES 子句具有以下语法。
REFERENCES 子句

元素
描述
限制
语法
column 被引用表中被引
用的列
请参阅 对引用约束的限制. 标识符
table 被引用表
被引用表和引用表必须驻留在
同一数据库中
标识符
REFERENCES 子句允许您在一个或多个列上放置外键引用。被引用的列和引用
列可以在同一表中,或在同一数据库的不同表中。
如果被引用表与引用表不同,则缺省的 column 是主键列。如果被引用表与引用
表相同,则没有缺省主键列。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 134
可选的 ON DELETE CASCADE 关键字可在 REFERENCES 子句中被指定为最后
的关键字,或者它们可跟随在声明的约束定义中约束名称之后。有关在 DELETE
操作中的这些关键字的作用的信息,请参阅使用 ON DELETE CASCADE 选
项 。
对引用约束的限制
必须拥有 REFERENCES 权限才能创建引用约束。
以下限制应用到在 REFERENCES 子句中指定(被引用列)的 column:

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

被引用表(或列组)必须拥有唯一约束或主键约束。

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

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

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

约束使用创建时生效的排序规则。

列级 REFERENCES 子句只能包含单独一个列名称。

表级的 REFERENCES 子句中最大列数为 16 。

表级的 REFERENCES 子句列的总长度不能超过 390 字节。
引用子句的缺省列
如果被引用表与引用表不同,则无须指定被引用列;缺省列是被引用表的主键列
(或列组)。如果被引用表与引用表相同,则你必须指定被引用列。
以下示例创建在 cust_calls 表中创建了新列 ref_order 。ref_order 列是引用
orders 表中 order_num 列的外键。
ALTER TABLE cust_calls
ADD ref_order INTEGER

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 135
REFERENCES orders (order_num)
BEFORE user_id;
如果您在一列或一组列上放置引用约束,并且重复索引和唯一索引已存在于该列
或该组列上,则索引被共享。
使用 ON DELETE CASCADE 选项
如果您希望当 DELETE 或 MERGE 语句删除父表中的行时,子表中相应的行也
被删除,则使用 ON DELETE CASCADE 选项。
此处,parent table 是定义启用外键约束的 REFERENCING 子句指定的表 ,
child table 是定义启用外键约束的表。如果您不指定级联删除,则在某个表被其
它表用主键外键关系引用的情况下,数据库服务器的缺省行为防止 DELETE 和
MERGE 语句删除该表中的数据。
如果您指定此选项,则当删除父表中的行时,数据库服务器还删除任何与子表的
该行(外键)关联的行。ON DELETE CASCADE 选项的运行您减少执行删除操
作所需的 SQL 语句的数量。
例如:在 stores_demo 数据库中,stock 表将 stock_num 列包含为主键。
catalog 表引用 stock_num 列作为外键。以下 ALTER TABLE 语句删除现有外键
约束(没有级联删除),并添加指定级联删除的新约束:
ALTER TABLE catalog DROP CONSTRAINT aa;
ALTER TABLE catalog ADD CONSTRAINT
(FOREIGN KEY (stock_num, manu_code) REFERENCES stock
ON DELETE CASCADE CONSTRAINT ab);
如果在子表上指定了级联删除,则除了从 stock 表中删除 stock 项以外,还删除
级联到与 stock_num 外键相关联的目录表。此级联删除仅当 stock_num 没有订
购时有效;否则,items 表中的约束将不允许级联删除。有关更多信息,请参阅
表有级联删除时对 DELETE 的限制 。
如果表带有 DELETE 触发事件的触发器,则您不能在该表上定义级联删除引用
约束。当您试图将指定 ON DELETE CASCADE 的引用约束添加到有删除触发器
的表时,接收到一条错误。
TRUNCATE 语句无法从子表进行级联删除。TRUNCATE 语句的目标表不能被在
另一个定义启用外键约束表引用(除非子表没有行)。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 136
有关从具有级联删除的表中删除行时的语法限制和锁定音响的信息,请参阅级联
删除表时的注意事项。
引用约束创建期间持有的锁定
当您创建引用约束时,数据库服务器在被引用的表上放置互斥锁。锁定在您的
ALTER TABLE 语句结束之后,或者在事务末尾时是释放(如果正在更新数据库
中使用事务日志记录的表)。
CHECK 子句
检查约束指明了在数据可插入列 before 必须满足的条件。
CHECK 子句

插入或更新时,如果行对表上定义的任何检查约束返回 false ,则数据库服务器
返回一条错误。然而,如果行对检查约束返回 NULL ,则不返回错误。在某些情
况下,您可能希望同时使用检查约束和 NOT NULL 约束。
检查约束是使用搜索条件定义的。搜索条件不能包含用户定义的例程、子查询、
聚集、主变量或行标识。另外,条件不能包含变量内置函数 CURRENT 、
SYSDATE 、USER 、CURRENT_USER 、SITENAME 、DBSERVERNAME 或
TODAY 。
检查约束不能包含不同表中的列。当正在使用 ADD 或 MODIFY 子句时,检查
约束不能依赖于相同表的其它列中的值。
下一示例添加一个新的 unit_price 列到 items 表,并包含一个检查约束来确保
输入的值大于 0:
ALTER TABLE items
ADD (unit_price MONEY (6,2) CHECK (unit_price > 0));
要创建检查多个列中值的约束,请使用 ADD CONSTRAINT 子句。以下示例在先
前示例中添加的列上构建了一个约束。检查约束现在跨越了表中的两列。
ALTER TABLE items ADD CONSTRAINT CHECK (unit_price < total_price);
Add Column SECURED WITH Label 子句

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 137
此 Add Column Security Label 子句使新列与一个安全标签相关联。
Add Column SECURED WITH Label 子句

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

必须存在且必须属于保护该表的同一个安
全策略
标识符
用法
只有持有 DBSECADM 角色的用户才能在 ALTER TABLE 语句中使用此子句。
ALTER TABLE 语句不能向以下类别的表对象中添加安全标签:

虚拟表接口(VTI)表或虚拟索引接口(VII)表

用户定义或系统定义的临时表(TEMP)

已命名或未命名的 ROW 类型表

类型表层次结构中的父表或子表

没有基于标签的安全策略的表
必须指定不带 policy 限定符的 label 名称,而不是 policy.label ,因为该表当前
的安全策略是表中仅有的保护数据的安全标签有效策略。
该列不能是 IDSSECURITYLABEL 类型。
当持有合适基于标签存取权限的用户试图存取受保护列中的数据,数据库服务器
会将此标签与该用户的安全凭据比较,从而在比较的基础上允许或拒绝存取。
有关添加和删除该表基于标签的安全策略的语法,请参阅 Add Column SECURED
WITH Label 子句 。
ADD AUDIT 子句
使用带有 ALTER TABLE 命令的 ADD AUDIT 子句使表包含选择性行级审计。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 138
当您使用 ADD AUDIT 子句更改表,则当选择性行级别审计开始时,会记录表中
行级审计事件。表自己应用 ADD AUDIT 属性并不会启用选择性行级审计。当
adtcfg 文件的 ADTROWS 参数设置为 1 或 2(通过使用 onaudit -R 命令)时,
启用该类型的审计。
如果未启用选择性行级审计,则表中的 ADD AUDIT 属性没有影响。
必须拥有 RESOURCE 或 DBA 权限才能用 ADD AUDIT 子句运行 ALTER
TABLE 命令。
SECURITY POLICY 子句
该可选的 SECURITY POLICY 子句可用以下语法来删除当前与该表相关联的安全
策略或给没有安全策略的表关联一个安全策略。
SECURITY POLICY 子句

元素
描述
限制
语法
policy 安全策略的名

必须是保护该表的安全策略
标识符
只有 DBSECADM 可以使用此语句向现有表添加安全策略,或移除当前保护该表
的安全策略。
ALTER TABLE 语句不能向由 CREATE EXTERNAL TABLE 语句定义的表中添
加安全策略。
以下准则适用于执行 ALTER TABLE 语句 ADD SECURITY POLICY 子句进行保护的
表:

除非表具有与其相关联的安全策略或表具有任一被保护的行,否则该表未
受到保护。前一种情况说明该表是拥有行级别粒度的受保护的表,后一种
情况说明该表是拥有列级别粒度的受保护的表。

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

如果该表没有与它关联的安全策略,那么使用 ALTER TABLE ... ADD 语
句向现有表中添加 IDSSECURITYLABEL 列保护行的操作失败。

如果该表没有与它关联的安全策略,则保护列的 ALTER TABLE ...
MODIFY ... COLUMN SECURED WITH 子句失败。

一个表最多可以拥有一个安全策略。如果该表已有安全策略,则 ALTER
TABLE ... ADD SECURITY POLICY 语句失败。

表可用于多个受保护的列。每个受保护的列库具有不同的安全标签或某些
受保护的列共享同一安全标签。

不能使用此子句向临时表或在当前数据库之外的表中添加安全策略。

一个表只能拥有最多一个 IDSSECURITYLABEL 类型的列。

IDSSECURITYLABEL 列不能拥有列保护。

IDSSECURITY LABEL 列不能拥有单列约束或不能是多列引用约束或检
查约束的一部分。

IDSSECURITYLABEL 列不能被加密。

IDSSECURITYLABEL 列有隐式 DEFAULT NOT NULL 约束。列缺省值
是用户写入存取安全标签的值。

DBSECADM 不能删除 IDSSECURITYLABEL 列。必须持有一般
CONNECT 、RESOURCE 和 ALTER 存取权限才能删除该列。

ALTER TABLE 语句不能修改 IDSSECURITYLABEL 列。

如果以下任何条件为真,则向受保护分片中添加分片的操作失败:
o
如果源表和目标表没有使用相同的安全策略进行保护;
o
如果表不具有相同的保护粒度;
o
如果表受保护的列的设置不同,由同一安全标签保护。
有关使用 ALTER FRAGMENT 语句向受保护的表中连接分片的更多信息,请
参阅ATTACH 子句的其他限制 。

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

拆离受保护表的分片以创建一个新的表,该表的拥有相同的安全策略,相
同的行安全标签列且受保护列的设置也相同。
如果 DROP SECURITY POLICY 子句执行成功,则它会产生以下影响:

除非表具有与其相关联的安全策略或表具有任一被保护的行,否则该表未
受到保护。前一种情况说明该表是拥有行级别粒度的受保护的表,后一种
情况说明该表是拥有列级别粒度的受保护的表。

如果该表没有与它关联的安全策略,那么使用 ALTER TABLE ... ADD 语
句向现有表中添加 IDSSECURITYLABEL 列保护行的操作失败。

如果该表没有与它关联的安全策略,则保护列的 ALTER TABLE ...
MODIFY ... COLUMN SECURED WITH 子句失败。

当表的安全策略被删除时(通过 ALTER TABLE DROP SECURITY
POLICY 语句),IDSSECURITYLABEL 列也会自动被删除。如果该表拥
有一个或多个保护的,则这些列变为不受保护。
不要将 ALTER table 语句的 DROP SECURITY POLICY 子句与 DROP
SECURITY POLICY 语句混淆。

当 ALTER TABLE 语句的 DROP SECURITY POLICY 子句执行成功
时,它终止了表与安全策略的关联,删除IDSSECURITYLABEL 列,并
将表中受保护的数据的 LBAC 保护删除。然而,对于安全策略或被该策
略保护的其它表,它没有影响。

当 DROP SECURITY POLICY 语句执行成功是,它的影响依赖于该策略
是以 RESTRICT 方式或 CASCADE 方式删除,但是在任一种方式中,
它终止了指定的策略。更多有关 SQL 的 DROP SECURITY POLICY 语
句的信息和其限制信息,请参阅 DROP SECURITY 语句 的描述。
DROP Column 子句
使用 DROP Column 子句移除表结构中的一列或多列。
DROP Column Clause

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

元素
描述
限制
语法
column 要删除的列
的名称
必须存在于表中。任何分段表达式都不能引
用该列,同时它不是表的最后一列。
标识符
您不能发出可删除表中每一列的 ALTER TABLE DROP 语句。至少一列必须保留
于表中。
您不能删除是分片存储策略的分片键一部分的列。
由安全标签保护的列可以通过使用 ALTER TABLE DROP 语句删除,但是该用户
必须是 DBSECADM 且还必须持有修改该表的结构的一般 CONNECT 、
RESOURCE 和 ALTER 存取权限。
删除一列如何影响约束
当您删除列时,该列上的所有约束也被删除:

所有单列约束被删除。

所有引用该列的引用约束被删除。

所有引用该列的检查约束被删除。

如果列是多列主键约束或唯一约束的一部分,则多列上放置的约束也被删
除。此操作接下来触发引用多列的所有引用约束的删除。
由于当删除列时任何与列相关联的约束被删除,因此当使用此子句时其它表的结
构也可能改变。例如,如果被删除的列是在其它表中被引用的唯一键或者主键,
则那些引用约束也被删除。因此那些其它表的结构也发生改变。
删除一列如何影响触发器
通常,从表中删除列时,基于该表的触发器不变。然而如果您删除的列出现在触
发器操作子句中,删除该列可使得触发器无效。以下语句说明了可能对触发器的
影响:
CREATE TABLE tab1 (i1 int, i2 int, i3 int);

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 142
CREATE TABLE tab2 (i4 int, i5 int);
CREATE TRIGGER col1trig UPDATE OF i2 ON tab1
BEFORE(INSERT INTO tab2 VALUES(1,1));
ALTER TABLE tab2 DROP i4;
ALTER TABLE 语句之后,tab2 仅有一列。col1trig 触发器已失效,因为当前用
两列的值定义的操作子句不能发生。
如果您删除了在 UPDATE 触发器的触发列列表中出现的列,则数据库服务器从
触发列列表删除该列。如果列是触发列列表的唯一成员,则数据库服务器从表删
除该触发器。有关 UPDATE 触发器中触发列的更多信息,请参阅 CREATE
TRIGGER 语句 。
如果更改底层的表使触发器失效,则删除然后重新创建触发器。
删除一列如何影响视图
当您从表删除列时,基于该表的视图保持不变。也就是,数据库服务器不自动从
关联的视图删除对应的列。
视图没有自动删除,因为 ALTER TABLE 可通过删除一列然后用相同的名称添加
一个新的列来更改表中列的顺序。这种情况下,基于已改变的表的视图继续有
效,但是保留它们原始的列顺序。
如果更改底层的表使视图失效,您必须使用 DROP VIEW 和 CREATE VIEW 语
句重新构建该视图。
DROP AUDIT 子句
当表启用了选定行级审计时,使用带 ALTER TABLE 命令的 DROP AUDIT 子句
从一组表中删除该表。
DROP AUDIT 子句只影响已标记列入选定行级审计中的表。如果您还未用 WITH
AUDIT 子句或 ADD AUDIT 子句创建或更改该表,那么不必要使用 DROP
AUDIT 从按行级审计的一组表中移除它。
从表中移除 AUDIT 属性不会禁用或改变数据库中其它表选定行级审计。
您必须是 DBSSO 才能运行 ALTER TABLE 命令的 DROP AUDIT 子句。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 143
MODIFY 子句
使用 MODIFY 子句更改列的数据类型、长度或缺省值,添加或删除列的安全标
签,允许或不允许列中有 NULL 值或者重置 SERIAL 、SERIAL8 或
BIGSERIAL 列的序列号。
MODIFY Clause

Modify Column Clause

元素
描述
限制
语法
column 要修改的列
必须在表中存在。不能是集合或
IDSSECURITYLABEL 数据类型。
标识符
您不能将列的数据类型更改为 COLLECTION 或 ROW 类型。
受保护表的 IDSSECURITYLABEL 列不能被不同的数据类型修改,现有的列也不
能被更改为 IDSSECURITYLABEL 类型。
当修改列时, 所有 先前与该列相关联的属性(即,缺省值、单列检查约束或引用
约束)被删除。当希望保留列的某些属性,例如 PRIMARY KEY ,您必须在同
一 MODIFY 子句中重新指定那些属性。
例如,如果您将现有列 quantity 的数据类型更改为 SMALLINT ,但希望保留其
缺省值(在这种情况中,为 1)和 NOT NULL 列属性,可以发出以下语句:
ALTER TABLE items MODIFY (quantity SMALLINT DEFAULT 1 NOT NULL);
注: 在 MODIFY 子句中两个属性都再次被指定。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 144
当在 MODIFY 子句中指定 PRIMARY KEY 约束,数据库服务器也会默示地在
同一列创建 NOT NULL 约束或将同一组列更改为主键。
当更改列的数据类型时,数据库服务器不会在适当的位置执行修改。下个示例将
VARCHAR(15) 列更改为 LVARCHAR(3072) 列:
ALTER TABLE stock MODIFY (description LVARCHAR(3072));
当修改有列约束与之相关联的列时,以下约束被删除:

所有单列约束被删除。

所有引用该列的引用约束被删除。

如果被修改列是多列主键或者唯一约束的一部分,则所有引用多列的引用
约束也被删除。
例如,如果修改具有唯一约束的列,则该唯一约束被删除。如果其它表中的列引
用该列,则这些引用约束也被删除。另外,如果该列是多列主键或唯一约束的一
部分,则不删除多列约束,但其它表放置在该列上的任何引用约束要被删除。
另一个示例,假设列是多列主键约束的一部分。其它两个表中的外键引用该主
键。如果修改此列,则不删除多列主键约束,但是其它表放置在它上面的引用约
束要被删除。
考虑以下语句定义的表:
CREATE TABLE tab1(c1 INT, c2 INT);
要添加 NOT NULL 约束,则需要 ALTER TABLE MODIFY 语句:
ALTER TABLE tab1 MODIFY (c1 INT NOT NULL);
不能使用 ADD CONSTRAINT 子句添加 NULL 或 NOT NULL 约束。
使用 MODIFY 子句
您试图修改对象的特征可影响您如何处理您的修改。
更改 BYTE 和 TEXT 列
您可使用 MODIFY 子句将 BYTE 列更改为 TEXT 列,反之亦然。还可使用
MODIFY 子句将 BYTE 列更改为 BLOB 列,将 TEXT 列更改为 CLOB 列。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 145
然后,除去这些操作,您不能使用 MODIFY 子句将 BYTE 或 TEXT 列更改为
其它任一一种类型的列,也不能将其它类型的列更改为 BYTE 或 TEXT 列。
当您使用此语句将 BYTE 列更改为 BLOB 列,或将 TEXT 列更改为 CLOB 列
时,也可以使用 ALTER TABLE 语句的 PUT 子句 指定 sbspace 并定义它的特
征以存储 BLOB 或 CLOB 对象。
更改下一个顺序值
您可以使用 MODIFY 子句来复位 SERIAL 或 BIGSERIAL 或 SERIAL8 列的下
一个值。不能将下一个值设置为低于列中的当前最大值,因为该操作可导致数据
库服务器生成重复数值。然而可将下一个值设置为任何高于当前最大值的值,这
将在一系列值中创建间隔。
如果您指定的新顺序值小于顺序列中当前的最大值,则该最大值将保持不变。如
果最大值小于您指定的值,那么下一个顺序数值将是您指定的值。在以下两种情
况中,下一个顺序值不会大于该列中的最大顺序值:

当创建表(或是通过先前的 ALTER TABLE 语句创建)时,表中没有任
何行,而且指定了一个初始的顺序值。

表中有行,但是前一个 ALTER TABLE 语句修改了下一个顺序值。
以下示例将下一个顺序值设置为 1000 :
ALTER TABLE my_table MODIFY (serial_num SERIAL (1000));
作为备选方法,您可使用 INSERT 语句,在列中一系列顺序值中创建间隔。有关
更多信息,请参阅 将值插入到串行列之内 。
在类型表中更改下一个顺序值
您可以使用 ALTER TABLE 语句的 MODIFY 子句对 ROW 类型字段设置初始
顺序数值或修改下一个顺序数值。(当创建 ROW 数据类型时,您不能为顺序字
段设置初始值。)
假设您有 ROW 类型 parent 、 child1 、 child2 和 child3 。
CREATE ROW TYPE parent (a int);
CREATE ROW TYPE child1 (s serial) UNDER parent;
CREATE ROW TYPE child2 (b float, s8 serial8) UNDER child1;
CREATE ROW TYPE child3 (d int) UNDER child2;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 146
然后创建对应的类型表:
CREATE TABLE OF TYPE parent;
CREATE TABLE OF TYPE child1 UNDER parent;
CREATE TABLE OF TYPE child2 UNDER child1;
CREATE TABLE OF TYPE child3 UNDER child2;
要将下一个 SERIAL 和 SERIAL8 编号更改为 75 ,您可以输入以下语句:
ALTER TABLE child3 MODIFY (s serial(75), s8 serial8(75));
当执行 ALTER TABLE 语句时,数据库服务器更改 child1 、child2 和 child3
表中的对应的顺序列。
更改字符列
您可使用 MODIFY 子句更改现有 CHAR 、LVARCHAR 、NCHAR 、
NVARCHAR 或 VARCHAR 列发布的长度。
类似地,MODIFY 子句可以将字符型列的数据类型更改为非字符数据类型。
对于修改为内置字符数据类型的列,显式或缺省的大小规范以字节为单位进行解
释,除非创建数据库服务器时 SQL_LOGICAL_CHAR 配置参数的设置为在字符
类型声明中启用逻辑字符语义。有关 ALTER TABLE 语句声明字符列的大小规范
时逻辑字符语义的更多信息,请参阅 字符列中支持的逻辑字符。有关
SQL_LOGICAL_CHAR 配置参数的更多信息,请参阅 GBase 8s 管理员参考手
册 。有关多字节本地语言环境和逻辑字符的其它信息,请参阅 GBase 8s GLS 用
户指南 。
在创建为 NLSCASE INSENSITIVE 的数据库中,将 NCHAR 或 NVARCHAR
类型的字符列更改为 CHAR 、 LVARCHAR 或 VARCHAR 类型导致数据库服
务器处理修改后的列值以区分大小写。
相反,在同一区分大小写的数据库中,将 CHAR 、LVARCHAR 或 VARCHAR
类型的字符列更改为 NCHAR 或 NVARCHAR 类型时,导致在已修改的列中值
要进行区分大小写的处理。(数据值没有改变,但是在对这些值比较和排序操作
中会忽略其字母大小写的变化。)

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 147
更改表结构
当使用 MODIFY 子句时,还可更改其它表的结构。如果其它表引用已修改的
列,则那些引用约束被删除。必须使用 ALTER TABLE 语句,再次将那些约束添
加到引用表。
当更改现有列的数据类型时,所有数据均转换到新数据类型,包括数字转换到字
符以及字符转换到数字(如果这些字符代表数值的话)。以下语句更改 quantity
列的数据类型:
ALTER TABLE items MODIFY (quantity CHAR(6));
但是,当存在主键或唯一约束时,则仅当不违反约束时发生转换。如果数据类型
转换导致出现重复值(例如,通过将 FLOAT 更改为 SMALLFLOAT,或通过截
短 CHAR 值),那么 ALTER TABLE 语句失败。
为 NULL 值修改表
在列未包含 NULL 值的前提下,您可以将以前允许 NULL 的现有值修改为不允
许 NULL 。要做到这点,使用相同的列名和数据类型以及 NOT NULL 关键字来
指定 MODIFY 。那些关键字在列上创建 NOT NULL 约束。
您可将不允许 NULL 的现有列修改为允许 NULL 。要做到这点,使用列名和现
有的数据类型来指定 MODIFY ,并省略 NOT NULL 关键字。NOT NULL 关键
字的省略删除了列上的 NOT NULL 约束。如果列上存在唯一索引,您可使用
DROP INDEX 语句将之除去。
在不允许 NULL 值的现有列中允许 NULL 值的备选方法是,使用 DROP
CONSTRAINT 子句删除列上的 NOT NULL 约束。
当定义 PRIMARY KEY 约束时,数据库服务器也默示地在同一列上创建 NOT
NULL 约束,或将同一列组变为主键。
向非 Opaque 列添加约束
ALTER TABLE ... MODIFY 操作使用单列约束隐式地在非 opaque 列创建索引,
并自动计算指定的列的分布存储。当定义下定义约束时,分布存储统计信息为该
表设置查询计划时,这些统计信息可用于查询优化器:

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

对于作为 B-tree 索引的新的约束,该重新计算的列分布统计信息相当于
在 HIGH 模式下 UPDATE STATISTICS 语句创建的分布。

如果新的约束不是 B-tree 索引,对应自动重新计算的分布统计信息由
UPDATE STATISTIC 语句在 LOW 模式下创建。
有关在现有表上创建索引或约束时自动产生统计分布的其它信息,另见 CREATE
INDEX 语句中 自动计算分布统计信息 章节的描述。
Modify Column Security
Modify Column Security 子句只对按安全策略保护的表有效。使用此子句给列添加
或删除行级安全。
Modify Column Security 子句

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

必须存在且必须属于保护该表的同一安全
策略。
标识符
此子句可以添加或删除行级保护。

要删除列的行级保护,请指定 DROP COLUMN SECURITY 关键字。

要为列提供的行级保护,请指定 SECURED WITH label (或者
COLUMN SECURED WITH label)。
该安全标签可以是保护该表的其它行或列的同一标签,或者是同一安全策略的不
同标签。以下限制应用于SECURED WITH 标签选项:

该列不能是 IDSSECURITYLABEL 类型。

指定不带 policy 限定符的 label 而不是 policy.label 。

label 必须是保护此表的安全策略的标签。
当现有行违法约束时添加约束
如果您使用 MODIFY 子句添加处于启用方式的约束,但因为现有行违反约束而
接收到错误消息,则采取以下步骤来成功添加约束:

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 149
1. 添加处于禁用方式的约束。
再次发出 ALTER TABLE 语句,但这次在 MODIFY 子句中指定
DISABLED 关键字。
2. 使用 START VIOLATIONS TABLE 语句启动违例和诊断表。
3. 发出 SET CONSTRAINTS 语句将约束的数据库对象方式切换到启用方式。
当您发出该语句,将在违例表中复制目标表中违反约束的现有行;但是,您
会接收到完整性违例错误消息,且约束保持为禁用。
4. 在违例表上发出 SELECT 语句来检索复制自目标表的不一致行。
您可能需要连接违例表和诊断表来获得所有必要的信息。
5. 在目标表中违反约束的行上采取正确的操作。
6. 在您修正目标表中所有不一致行之后,再次发出 SET 语句以启用被禁用的
约束。
此时约束被禁用,并且没有返回任何完整性违例错误消息,因为此时目标表
中的所有行均满足新约束。
修改列如何影响触发器
如果您修改了在 UPDATE 触发器的触发列列表中出现的列,则触发器保持不
变。
当您修改表中的列,基于该表的触发器保持不变,但列修改可能会使触发器无
效。
以下语句说明了可能对触发器的影响:
CREATE TABLE tab1 (i1 INT, i2 INT, i3 INT);
CREATE TABLE tab2 (i4 INT, i5 INT);
CREATE TRIGGER col1trig UPDATE OF i2 ON tab1
BEFORE(INSERT INTO tab2 VALUES(1,1));
ALTER TABLE tab2 MODIFY i4 CHAR;
在 ALTER TABLE 语句之后,列 i4 仅接受字符值。因为字符列仅接受包含在引
号中的值,所以 col1trig 触发器的操作子句失效。
如果修改基础表使得触发器失效,则删除再重新创建触发器。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 150
修改列如何影响视图
当您修改表中的列时,基于该表的视图保持不变。如果更改基础表使得视图失
效,则必须重新构建该视图。
PUT 子句
使用 PUT 子句为包含智能大对象的列指定存储空间(sbspace)。该子句可以指
定新列的存储特征或替换现有列的存储特征。它的语法类似于 CREATE TABLE
语句的 PUT 子句,但是它只指定单个列而不是列的列表。
PUT 子句

元素
描述
限制
语法
column
要存储在指定
sbspace 中的列
必须是 UDT 、或
complex 、BLOB 或
CLOB 数据类型
标识符
kilobytes
要为 extent 大小
分配的千字节数
必须是整数值
精确数值
sbspace
只能大对象的存储
区域的名称
sbspace 必须存在
标识符

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 151
当您修改列的存储特征时,所有先前与该列的存储空间相关联的属性均被删除。
当您希望保留某些属性时,必须重新指定那些属性。例如,要保留日志记录,您
必须重新指定 log 关键字。
格式 column.field 在此处无效。即,您所存储的智能大对象不能是 row 类型的一
个字段。
当您修改存放智能大对象的列的存储特征时,数据库服务器不会更改已经存在的
智能大对象,而是将新存储特征仅应用于那些 ALTER TABLE 语句生效后插入的
智能大对象。
以下示例修改了表 sbtab ,将 BLOB 列 c1 存储于 sbspace sbs1 ,更改
extent 大小为 32 千字节,并打开了事务日志记录:
ALTER TABLE sbtab PUT c1 IN (sbs1) (EXTENT SIZE 32, LOG);
以下示例将日志记录状态更改为 NO LOG ,并不保留 BLOB 列最后一次的存取
时间:
ALTER TABLE sbtab PUT c1 IN (sbs1) (NO LOG, NO KEEP ACCESS TIME);
以下示例修改表,将 BLOB 列 c1 存储于 sbspaces sbs1 和 sbs2 ,更改 extent
大小为 100 千字节,并打开了事务日志记录,且保留了最后一次存取时间:
ALTER TABLE sbtab PUT c1 IN (sbs1, sbs2)
(EXTENT SIZE 100, LOG, KEEP ACCESS TIME);
有关 PUT 子句的关键字描述和可用的存储特征的信息,请参阅 CREATE TABLE
语句 PUT 子句 中与本节相对应的部分。有关大对象特征的讨论,请参阅 大对
象数据类型 。
ADD CONSTRAINT 子句
使用 ADD CONSTRAINT 子句指定新列或现有列或列组上的主键约束、外键约
束、引用约束、唯一约束或检查约束。


GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 152
例如,要将唯一约束添加至 customer 表的 fname 和 lname 列,请使用以下语
句:
ALTER TABLE customer ADD CONSTRAINT UNIQUE (lname, fname);
要声明约束的名称,请更改上述语句(给该约束添加 CONSTRAINT 关键字和标
识符):
ALTER TABLE customer
ADD CONSTRAINT UNIQUE (lname, fname) CONSTRAINT u_cust;
在同一表上定义的约束的标识符的名称必须唯一。如果没有定义此约束的名称,
则数据库服务器会为其指定系统定义的标识符,并将此名称存储至系统目录表的
sysconstraints.constrid 列。
缺省情况下,新约束是启用的。要添加未启用的约束,您可以在该约束的名称之
后包含 DISABLED 关键字:
ALTER TABLE customer
ADD CONSTRAINT UNIQUE (lname, fname) CONSTRAINT u_cust DISABLED;
在您希望强制执行此约束 的 DML 操作之前,可以使用 SET Database Object
Mode 语句启用该禁用的约束。
当您未指定新约束的名称时,则数据库服务器会提供一个名称。您可以在
sysconstraints 系统目录表中找到约束的名称。有关 sysconstraints 系统目录表的
更多信息,请参阅 GBase 8s SQL 参考指南 。
由 ALTER TABLE 定义约束的限制
以下有关 ADD CONSTRAINT 子句(和 MODIFY 子句)的限制会影响 ALTER
TABLE 语句定义的约束:

当您添加约束时,它的排列顺序必须与创建表时顺序一致。

ADD CONSTRAINT 子句不能在任何数据类型的列上定义 NULL 或
NOT NULL 约束。只有 MODIFY 子句才能在现有表的列上定义 NULL
或 NOT NULL 约束。

您不能在 RAW 表上定义主键约束、外键约束或唯一约束。然而您可以
使用 ALTER TABLE 语句的 MODIFY 子句在 RAW 表上的列中定义
NOT NULL 约束或 NULL 约束(但是不能都定义)。有关在现有表的
列上添加 NULL 或 NOT NULL 约束的语法,请参阅 MODIFY 子句。

您不能在 BYTE 或 TEXTY 列上放置唯一约束或引用约束。

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

BYTE 或 TEXTA 列的检查约束只检查 IS NULL 、IS NOT NULL 或
LENGTH 。

缺省情况下,每个 IDSSECURITYLABEL 列具有隐式 NOT NULL 约
束。然而您不能使用 ADD CONSTRAINT 子句引用在单列约束的定义中
的 IDSSECURITYLABEL 列,也不能引用作为多列引用约束或检查约束
的一部分的 IDSSECURITYLABEL 列。
多列约束格式
使用此选项将一个或多个约束指定到现有表中的一个列或一组列。
它与 CREATE TABLE 语句的多列约束格式极其类似,但是可选的 INDEX
DISABLED 关键字在 CREATE TABLE 语句定义的外键约束中无效(返回错
误)。
多列约束格式

FOREIGN KEY 定义

元素
描述
限制
语法
column
放置约束的列
不超过 16 列
标识符

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 154
元素
描述
限制
语法
constraint
禁用的外键约束的名称
在数据库中的索
引和约束的名称
中它必须唯一
标识符
在 CREATE TABLE 语句中,ALTER TABLE 的多列约束格式与单列约束格式不
同之处在于,当您指定外键约束时,在 REFERENCES 子句之前需要 FOREIGN
KEY 关键字。此外,如它的名称所指,多列约束格式可指定列列表作为新约束的
范围,此语法同样对单列有效。
有关 INDEX DISABLED 关键字选项的更多信息,请参阅 在外键的定义中使用
INDEX DISABLED 关键字 。
多列约束具有以下基数和大小限制:

可包含的列名不多于 16 个。

最该列列表的总长度的最大值依赖于页大小,计算公式为:
MAXLength = (((PageSize - 93)/5) -1)
o
对于 2K 的页大小,总长度不能超过 390 字节。
o
对于 16K 的页大小,总长度不能超过 3257 字节。
此处的反斜杠( / )符号代表整除。
如果您在同一列上定义了 NOT NULL 约束和 NULL 约束或在缺省值为 NULL
的列上定义了 NOT NULL 约束,则该语句失败并返回错误。
您不能在 LIST 、MULTISET 、SET 、或 IDSSECURITYLABEL 数据类型的列
上定义 NULL 约束。
如果一组列中有一列存储了加密数据,则 GBase 8s 无法强制执行此组列的约
束。您可以发布此约束的名称并将用 约束定义 设置它的方式。
如果 ALTER TABLE ADD CONSTRAINT 语句在同一表中了定义多个引用约束,
则每个约束需要它自己所有的REFERENCES 子句,因此每个单独的约束可指定
(或忽略)类似 ON DELETE CASCADE 的选项,而不是将其应用至所有的约
束。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 155
如果数据库服务器在同一非 opaque 列或列组上隐式地创建了索引作为引用约
束,则会自动计算指定列的分别存储统计或多列约束的主列。
这些分布存储统计相当于 STATISTICS 语句在 HIGH 方式中创建的分布,且当
其作为创建了新约束的表查询计划时,可用于查询优化器。有关在现有表上创建
索引或约束时计算分布存储的其它信息,请参阅 CREATE INDEX 语句中自动计
算分布统计信息章节中的描述。
当被引用表上存在索引时创建外键约束
缺省情况下,当 ALTER TABLE 语句的 ADD CONSTRAINT 或 MODIFY 选项
包含 REFERENCES 关键字以定义一个外键约束时,数据库服务器自动验证启用
的引用约束。如果被引用表的列(列组)上已经含有与引用约束的键对应的唯一
索引或主键约束,则在外键约束验证期间,您可能节省一些时间。
数据库服务器根据如何验证外键约束而做出成本基础决策。在许多情况下索引键
算法可能较快,因为它在验证约束时,只扫描索引值而不是扫描表中所有的行。
数据库服务器可以考虑使用索引键算法验证外键约束,但是仅在以下所有条件都
满足的情况下,才能使用该算法:

ALTER TABLE 语句正在创建只有一个外键约束。
如果在这种情况下,数据库服务器只需要检查要创建外键约束的列的单独
值。而在同一时刻验证两个外键约束需要在同一扫描中使用两个指标,该
情况不支持此行为。

该语句不只创建或启用一个 CHECK 约束。
如果该 ALTER TABLE 语句正在创建多个约束,则验证 CHECK 约束需
要检查每一行,而不是单个值。在这种情况下,索引键算法不能用于验证
外键约束。

创建外键约束的语句不须更改同一表中任何现有列的数据类型。
如果创建外键约束的 ALTER TABLE 语包含更改任何列的数据库类型的
MODIFY 子句,则数据库服务器不会考虑使用索引扫描执行路径来验证
约束。

此外键列不包括用户定义数据类型(UDTs)或内置 opaque 数据类型。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 156
要使快速索引键算法尽可能有效,它排除所有与用户定义或 opaque 数据
类型相关联的低效的执行例程,例如:内置与 opaque 类型中的
BOOLEAN 和 LVARCHAR。

新外键约束的方式不能是 DISABLED 。
如果它是禁用的,则不需要约束检查算法。因为不会发生验证参照完整性
的检查。

该表与活动的违例表没有关联。
违例表需要在同一时间检查,不满足新约束的每一行必须插入此违例表。
验证时扫描每一行可防止数据库服务器使用快速索引键算法忽略的重复的
行。
在一个行或多行违例的情况下,ALTER TABLE ADD CONSTRAINT 或 ALTER
TABLE MODIFY 语句可以创建并验证某些不满足上述要求的外键约束。扫描整
个表的额外验证成本一般与表的大小成比例。对于很大的表这些成本也将是巨大
的。
当您创建了自我引用外键约束(其 REFERENCING 子句指定了定义该约束的同
一表)时,数据库服务器可以考虑索引键算法用于验证参照完整性(如果以上条
件都满足)。
在外键的定义中使用 INDEX DISABLED 关键字
当您定义外键约束时包含可选的 INDEX DISABLED 关键字,可以放置表上的
DML 操作使用与数据库服务器关联的外键的索引。如果您包含 INDEX
DISABLED 关键字,则它们必须是 ALTER TABLE 语句的最后规范。
在 ALTER TABLE 语句中定义外键约束
要添加外键约束,您必须在被引用列或子表上拥有 References 权限。如果您拥有
父表或有对父表的 Alter 权限,则您可以在该表上创建外键约束并指定您子句作
为此约束的所有者。当您持有 DBA 权限时,您可以为其他用户创建外键约束。
当 ALTER TABLE ADD CONSTRAINT 语句在引用子表的一列或一组列上放置外
键约束,且该列或该组列没有引用约束或用户定义索引存在时,数据库服务器在
指定的列或列组上创建一个内部 B-tree 索引。如果用户定义索引已经存在,则约
束共享现有的索引。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 157
如果 ALTER TABLE ADD CONSTRAINT 语句在同一表上定义多个外键,则每个
约束需要它自己的 REFERENCES 子句,并为每个约束指定(或忽略)INDEX
DISABLED 关键字。
INDEX DISABLED 选项在从集群环境中更新辅助服务器语句中发出的 ALTER
TABLE ADD CONSTRAINT 语句中有效。
外键索引可能降低性能的情况
尽管引用约束保护数据完整性,在某些情况下用户定义或系统生成的与数据库服
务器关联的外键约束的 B-tree 索引可以降低表(表很大)的操纵数据操作的效
率。如果未从父表删除,则该索引不用在子表中锁定行以级联删除。如果子表不
需要使用此索引进行查询。在此情境中,并不需要索引,但是这并不意味在子表
中修改、删除和插入行的操作中该索引是不重要的。如果禁用对应于外键约束的
索引,则在子表上存取数百万行数据的应用可能需要较少的资源。
在这些情况下,ALTER TABLE ADD CONSTRAINT 语句的 INDEX DISABLED
关键字选项提供一个机制,即定义外键时避免大量关联 b-tree 索引的开销。
当您在约束定义的末尾包含 INDEX DISABLED 关键字时,如果没有合适的用户
定义索引存在,数据库服务器禁用系统生成的索引。如果在子表上的外键列或
(列组)已存在用户定义索引,则数据库服务器禁用该索引。随后的子表上的
DML 存在会在没有索引的情况下实现,而且只需要最小的系统资源以维护和存储
该禁用的索引。
Effects of the INDEX DISABLED 关键字的影响
当您在约束定义的末尾包含 INDEX DISABLED 关键字时,如果没有合适的用户
定义索引存在,则数据库服务器禁用系统生成的索引。如果在子表上的外键列或
(列组)已存在用户定义索引,则数据库服务器禁用该索引。随后的子表上的
DML 存在会在没有索引的情况下实现,而且只需要最小的系统资源以维护和存储
该禁用的索引。
这些是您成功使用 INDEX DISABLED 选项添加外键约束时数据库服务器发生的操
作:

与外键约束关联的索引被标识。

该索引被禁用,且在系统目录的 sysobjstate 表中标记为禁用。

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

该物理索引已从数据库中删除。

sysfragments 系统目录表变更为显示没有存储分配给此索引。
INDEX DISABLED 关键字对于您定义的外键约束没有影响。数据库服务器强制
执行此约束,如果随后对子表或父表的 DML 操作违例了指定外键约束则发出错
误。
以下限制应用于约束定义中的 INDEX DISABLED 关键字:

INDEX DISABLED 选项只在外键定义中可用。

只有 ALTER TABLE ADD CONSTRAINT 语句支持此语法。如果
CREATE TABLE 或者 ALTER TABLE MODIFY COLUMN 语句的外键
定义包含 INDEX DISABLED 关键字,则CREATE TABLE 或者
ALTER TABLE MODIFY COLUMN 语句返回异常。

如果被外键使用的索引正在被另一个约束使用,则数据库服务器返回错
误。

如果您在约束定义中包含禁用该外键约束的 DISABLED 关键字,且您还
指定了 INDEX DISABLED 关键字则数据库服务器返回错误。如下所
示:
ALTER TABLE child ADD
CONSTRAINT(FOREIGN KEY(x1) REFERENCES parent(c1)
CONSTRAINT cons_child_x1 DISABLED INDEX DISABLED);
要纠正以上 ALTER TABLE ADD CONSTRAINT 示例中的错误,您必须删除第一
个 DISABLED 关键字,或者删除 INDEX DISABLED 关键字。
使用 INDEX DISABLED 创建外键约束的示例
假设在以下示例中的 parent 表和 child 表具有一个主键约束和外键约束,且存
储在这些表中您的数据满足下列条件:

parent 表只有少量行。

child 表由=有百万条行。

child 表中外键只有一些基于 parent 表的主键的不同的可能值。
该示例显示了如何使用 ALTER TABLE ADD CONSTRAINT 语句的 INDEX
DISABLED 选项。
CREATE TABLE parent(c1 INT, c2 INT, c3 INT);
CREATE UNIQUE INDEX idx_parent_c1 ON parent(c1);

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 159
ALTER TABLE parent ADD
CONSTRAINT PRIMARY KEY(c1)
CONSTRAINT cons_parent_c1;
CREATE TABLE child(x1 INT, x2 INT, x3 VARCHAR(32));
CREATE INDEX idx_child_x1 ON child(x1);

ALTER TABLE child ADD
CONSTRAINT(FOREIGN KEY(x1) REFERENCES parent(c1)
CONSTRAINT cons_child_x1 INDEX DISABLED);
在以上示例中,

cons_parent_c1 是 parent 表的一个主键约束,

cons_child_x1 是 child 表的一个外键约束,

idx_parent_c1 是唯一索引,且被 cons_parent_c1 约束共享,

并且 idx_child_x1 是被 cons_child_x1 约束共享的索引。
子表上的数据操纵语言操作(例如:UPDATE 、DELETE 、INSERT 和
MERGE )不能使用被外键约束共享的 idx_child_x1 索引,因为该索引现在是
禁用的。
然而,对于某些含有主键和外键依赖的表,查询优化器可能会在执行计划中选择
基于 WHERE 子句子表上的其它索引。
如上所述,在外键定义中使用 INDEX DISABLED 选项只有在子表非常大时才可
能提高性能,通常在数据仓库应用的情况下。不建议在小的表上使用该语法选项
操作。
在 NOVALIDATE 方式下创建外键约束
ALTER TABLE ADD CONSTRAINT 语句可以创建或过滤 NOVALIDATE 方式的
外键约束。NOVALIDATE 约束方式防止数据库服务器在创建引用约束时,验证
每一行的外键值是否符合被引用表中的主键值。
使用此语法创建启用或过滤 NOVALIDATE 方式的外键约束:
ALTER TABLE ADD CONSTRAINT

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

元素
描述
限制
语法
constraint 发布此处约束的名称
在数据库中的索引和约束的名
称中必须唯一
标识

fk_col
constraint 的外键列 必须存在于子表
标识

pk_col
被引用表中的外键列
必须存在于被引用表
标识

pk_tab
被引用表的名称
必须存在于当前数据库
标识

table,
synonym
放置 constraint 的表 必须存在于当前数据库
标识

用法
该语法忽略 DISABLED 关键字。因为禁用的约束不会进行违例检查,在这种情
况下,NOVALIDATE 关键字不重要。
如果没有列或列表立即跟随在 REFERENCES 关键字之后,则缺省列(或列组)
是 pk_tab 表的主键。如果 pk_tab 和 table 或 synonym 指定同一表,则约束自
我引用,并没有缺省的主键列。
如果您没有声明约束的名称,则数据库服务器为此新约束生成一个标识符,它注
册在 sysconstraints 和 sysobjstate 系统目录表中。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 161
ALTER TABLE ADD CONSTRAINT 语句支持引用约束的 NOVALIDATE 方式作
为创建或过滤引用约束时绕过数据完整性检查的机制。
NOVALIDATE 方式可以提高性能的情况
尽管引用约束保护数据完整性,在某些情况下您正要移动到新数据库服务器实例
的数据库表是已知的自由参照完整性违规。对于大表上的外键约束,验证约束所
需的时间要十分充分。如果有数百万行的表正从 OLTP 环境移动至数据仓库环
境,则验证目标环境中的外键可能增加数量级迁移所需的时间。
例如,您可以删除大表上的外键约束,然后在该表迁移到目标表环境之前,立即
重新创建 ENABLED NOVALIDATE 方式或 FILTERING NOVALIDATE 方式的
约束。重建外键约束的 ALTER TABLE ADD CONSTRAINT 操作的花销几乎很
小,因为它绕过了对每一行引用约束的验证。因为 NOVALIDATE 方式不会持续
超过创建该约束的 ALTER TABLE 操作,抵达数据仓库环境中的表带有
ENABLED 或 FILTERING 方式的约束,保护了随后 DML 操作中数据的参照完
整性。
使用 NOVALIDATE 关键字的限制
创建外键约束时, NOVALIDATE 关键字仅在 ALTER TABLE ADD CONSTRAINT 语句
的 DDL 上下文中有效。 例如,您不能在以下任何 SQL 语句中创建处于
NOVALIDATE 方式的外键约束:

CREATE TABLE 语句

CREATE TEMP TABLE 语句

SELECT INTO TABLE 语句
如果满足下列条件,则您可以使用 ALTER TABLE ADD CONSTRAINT 语句在现有表
上创建处于 NOVALIDATE 方式的启用约束:

您正在添加的约束是外键约束。如果您在同一 ALTER TABLE 语句中创
建多个约束,那么所有的约束必须都是外键约束。

在 ALTER TABLE 语句中,NOVALIDATE 关键字只在 ADD
CONSTRAINT FOREIGN KEY 选项中有效。

ALTER TABLE 在 DISABLED 方式下创建的约束是无效的。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 162
如果在以下约束定义的语法上下文中包含 NOVALIDATE 关键字,则 ALTER TABLE
语句发生错误而失败:

ALTER TABLE ADD COLUMN 语句

ALTER TABLE INIT 语句

ALTER TABLE MODIFY 语句
使 NOVALIDATE 关键字有效的其它 DDL 语句只有 SET Database Object Mode 语
句的 SET CONSTRAINTS 选项。当运行 SET CONSTRAINTS 语句时,它可以
将现有外键约束的方式更改为这些 NOVALIDATE 约束方式:

ENABLED NOVALIDATE 方式

FILTERING WITH ERROR NOVALIDATE 方式

FILTERING WITHOUT ERROR NOVALIDATE 方式.
有关更多信息,请参阅 SET CONSTRAINTS 语句。
建立 NOVALIDATE 方式作为缺省方式
如果约束方式规范忽略 NOVALIDATE 关键字,则 SQL 的 SET
ENVIRONMENT NOVALIDATE ON 语句和加载数据库的 dbimport -nv 命令都可
以重写任何由 ALTER TABLE ADD CONSTRAINT 或 SET CONSTRAINTS 语句
指定的外键约束方式(除了 DISABLED)。

SET ENVIRONMENT NOVALIDATE ON 语句的范围是同一用户会话中
ALTER TABLE ADD CONSTRAINT 和 SET CONSTRAINTS 语句的后
续。

dbimport -nv 命令的范围是导出数据库的 .sql 文件中的 ALTER
TABLE ADD CONSTRAINT 和 SET CONSTRAINTS 语句,其路径名在
同一 dbimport 命令中指定。
创建 NOVALIDATE 方式的约束的示例
以下 DDL 语句创建了名为 parent 的表且在该表的 c1 列上定义了唯一索引和
主键约束:
CREATE TABLE parent(c1 INT, c2 INT, c3 INT);
CREATE UNIQUE INDEX idx_parent_c1 ON parent(c1);
ALTER TABLE parent ADD CONSTRAINT

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 163
PRIMARY KEY(c1) CONSTRAINT cons_parent_c1;
以下语句创建了另一个表,名为 child,它的第一列与 parent 表的主键列的数据
类型相同,并在 child 表定义主键约束 cons_child_x:
CREATE TABLE child(x1 INT, x2 INT, x3 VARCHAR(32));
ALTER TABLE child
ADD CONSTRAINT (FOREIGN KEY(x1)
REFERENCES parent(c1) CONSTRAINT cons_child_x1);
假设之后的 DML 操作(未显示)向此 parent 表和 child 表填充数据行。在一
些点,此工作流程要求数据从它的 OLTP 产品环境移动到另一个处理业务分析应
用程序的数据库中。
如果在这一点,child 表中的数据集包含大量行,则验证 cons_child_x1 引用约
束将会是新数据库导入 child 表要花费的显著成本。以下语句删除此约束:
ALTER TABLE child DROP CONSTRAINT cons_child_x1;
child 表导入到新的环境后,下列语句可以在 child 表上重建一个相同名称的约
束,而不用检查每一行的参照完整性违规:
ALTER TABLE child
ADD CONSTRAINT (FOREIGN KEY(x1)
REFERENCES parent(c1)
CONSTRAINT cons_child_x1 NOVALIDATE);
ALTER TABLE 语句执行完毕之后,新的 cons_child_x1 引用约束在缺省情况下
处于 ENABLED 方式。
添加主键或唯一约束
当您在一列或一组列上放置主键或唯一约束时,那些列必须包含唯一值。数据库
服务器检查是否存在现有约束和索引:

如果该列或该组列上已经存在用户创建的唯一索引,则约束将共享该索
引。

如果该列或该组列上已经存在用户创建的允许重复的索引,则数据库服务
器返回错误。

在这种情况下,您必须在添加主键或唯一约束之前删除现有索引。

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

如果在该列或该组列上已经存在引用约束,则重复索引将升级到唯一索引
(如果可能)并且共享该索引。

如果该列或该组列上不存在引用约束或用户创建的索引,则数据库服务器
在指定列上创建内部 B-tree 索引。
如果您在一列或一组列上放置引用约束,而该列或该组列上已经存在索引,则将
共享该索引。
如果您拥有该表,或拥有对该表的 Alter 权限,则可以在该表上创建检查、主键
或唯一约束并指定您自己作为该约束的所有者。要添加引用约束,您必须对被引
用的列或被引用的表拥有 References 权限。当您拥有 DBA 权限时,可以为其他
用户创建约束。
从约束违例中恢复
如果您使用 ADD CONSTRAINT 子句添加处于启用方式的约束,就会接收到错误
消息,因为现有行会违反约束。有关成功添加约束的过程,请参阅当现有行违法
约束时添加约束。
DROP CONSTRAINT 子句
使用 DROP CONSTRAINT 子句删除指定的约束。
ALTER TABLE 语句的 DROP CONSTRAINT 子句具有此语法:
DROP CONSTRAINT 子句

元素
描述
限制
语法
constraint
要删除的约束
在数据库中必须
存在
标识符
用法

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 165
要删除现有约束,请指定 DROP CONSTRAINT 关键字和此约束的名称。要删除
同一表上的多个约束,则约束名称列表必须逗号分隔并由括号分隔。
您要删除的约束可具有 ENABLED 、DISABLED 或 FILTERING 方式。
这里是一个删除约束的示例:
ALTER TABLE manufact DROP CONSTRAINT con_name;
以下示例删除了定义在 orders 表中的引用约束和检查约束:
ALTER TABLE orders DROP CONSTRAINT (con_ref, con_check);
GBase 8s 的 SQL 执行包含非 DROP CONSTRAINT 语句。然而,如果该语句存
在,则ALTER TABLE 语句的此子句提供一个 DROP CONSTRAINT 语句除外的
功能。
当 DROP TABLE 语句删除该表时,会默示地删除该指定表上所有的约束。
获取约束名称
DROP CONSTRAINT 子句需要约束的名称。如果创建约束时没有声明名称,则数
据库服务器生成新的约束的名称。您可以查询 sysconstraints 系统目录表以获得
约束的名称的所有者。例如,要查找位于 items 表上约束的名称,您可以发出以
下语句:
SELECT constrname FROM sysconstraints
WHERE tabid = (SELECT tabid FROM systables
WHERE tabname = 'items');
约束之间的依赖
当您删除拥有对应外键的主键约束或唯一约束时,任何相关联的引用约束也会被
删除。
例如,在 stores_demo 数据库中,orders 表的 order_num 列上具有主键约束。
对应的外键约束也定义在 items 表中的 order_num 列。这些约束定义在这两个
表中的 order_num 列定义了引用关系。
假设您运行 ALTER TABLE orders DROP CONSTRAINT 语句删除 orders 表
order_num 列上的主键约束。因为在这两个表之间的参照完整性关系不能没有主
键约束,如果此示例中的 ALTER TABLE 语句成功,则数据库服务器将会采取这些
操作:

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

删除 orders 表 order_num 列上指定的主键约束。

删除 items 表 order_num 列上对应的引用约束。

从系统目录中删除所有引用 orders 表的主键或 items 表上引用约束。
删除约束对系统目录的影响
数据库服务器维护这些系统目录表中的现有约束的信息:

sysconstraints(所有的约束)

sysobjstate(所有的约束)

syschecks (检查约束)

syscoldepend(检查约束和 NOT NULL 约束)

syscheckudrdep(UDR 引用的检查约束)

sysreferences(引用约束)

sysindices( 在 sysindices 中没有对应所有项的引用、主键或唯一约束)
当 DROP CONSTRAINT 子句成功删除约束之后,数据库服务器至少删除或更新
以上一个或多个表的一行。
数据类型的注意事项
缺省情况下,每一 IDSSECURITYLABEL 列拥有一个隐式的 NOT NULL 约束,
但是 DROP CONSTRAINT 子句不能引用 IDSSECURITYLABEL 类型的列。
您可以在 ROW 数据类型的已分类表的 ALTER TABLE 操作中包含 DROP
CONSTRAINT 子句。
还原引用约束
对于某些操作,例如将表重新定位到另一个数据库中,您可能要求引用约束暂时
不会对它的表产生影响。然而,当您不带此约束而完成操作后,数据库的参照完
整性通常要求还原此约束的功能。可能的选项是:

使用 DROP CONSTRAINT 子句删除此约束。

完成此任务需要避免该约束的影响。

使用 ALTER TABLE ADD CONSTRAINT 重建此约束。
对于符合已删除外键约束的大表,在 ALTER TABLE ADD CONSTRAINT 已经中
使用 NOVALIDATE 选项可以避免创建约束时使用全表扫描验证约束的显著成

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 167
本。此 NOVALIDATE 选项要求使 Multi-Column Constraint Format 语法定义此
约束。
类似地,比起删除大表上的引用约束,您可以禁用它,然后完成任务,使用禁用
的约束需要较少的资源。要恢复约束的强制性,您可以使用 SET Database Object
Mode 语句的 SET CONSTRAINTS 选项将此对象的方式重置为 ENABLED
NOVALIDATE 或 FILTERING WITH ERROR NOVALIDATE 或 FILTERING
WITHOUT ERROR NOVALIDATE。在以上每一种约束方式中,NOVALIDATE 关
键字避免了重置方式时验证约束的开销。
MODIFY EXTENT SIZE 子句
使用 ALTER TABLE 语句的 MODIFY EXTENT SIZE 子句更改数据库中表的第
一个 extent 的大小。
您不能使用该 MODIFY EXTENT SIZE 子句更改这些 extent 的大小:

在 blobspace 中的表中的第一个 extent

外部表、虚拟表或系统目录表中的第一个 extent

tblspace tblspace 中的第一个 extent
MODIFY EXTENT SIZE 子句

元素
描述
限制
语法
kilobytes 在此为该表的第一个
extent 分配的长度(以
千字节)
规范不可以是变量,而且(4
(页大小))≤ 千字节 ≤
(chunk 大小)
表达式
最小大小是磁盘页大小的 4 倍。例如,在一个 2 千字节页的系统上,最小长度
是 8 千字节。最大长度等于 chunk 大小。
以下示例指定了一个 32 千字节大小的 extent :
ALTER TABLE customer MODIFY EXTENT SIZE 32;
当您更改第一个 extent 的大小时,数据库服务器记录系统目录和分区页的更改,
但是在重建表或创建分区和分片时,只记录实际的更改。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 168
例如,如果表拥有一个 8 千字节大小的首个 extent,且您使用 ALTER TABLE
语句将其大小修改为 16 千字节,则数据库不会删除当前首个 extent 并按新的大
小重建它。而是,只有在服务器在该表上重建聚集索引或从该表拆离分片操作之
后重建此表时,第一个 16 千字节大小的 extent 才会生效。
如果一个不带 REUSE 选项的 TRUNCATE TABLE 子句在带有 MODIFY
EXTENT SIZE 子句的 ALTER TABLE 语句之前执行,则第一个 extent 的大小
不能发生改变。
如果在 dbspace 中现有表含有数据,并已为该表分配了第一个和第二个 extent ,
则您将不能更改第一个和第二个 extent 的大小。如果您想要更改现有 extent 的
大小,则必须删除此表,用包含希望的值的强有力的子句重建该表,并再次加载
数据。
您可以同时更改第一个和第二个 extent 的大小。以下示例指定更改第一个和第二
个 extent 的大小:
ALTER TABLE customer MODIFY EXTENT SIZE 32 NEXT SIZE 32
第一个和下一个 extent 的大小记录在 PNSIZES 逻辑日志记录中。
MODIFY NEXT SIZE 子句
使用 MODIFY NEXT SIZE 子句更改下一个 extent 的大小。
MODIFY NEXT SIZE 子句

元素
描述
限制
语法
kilobytes
在此为该表的下一个
extent 分配的长度(以
千字节)
规范不可以是变量,而且(4
(页大小))≤ 千字节 ≤
(chunk 大小)
表达式
最小大小是磁盘页大小的 4 倍。例如,在一个 2 千字节页的系统上,最小长度
是 8 千字节。最大长度等于 chunk 大小。以下示例指定了一个 32 千字节大小
的 extent :
ALTER TABLE customer MODIFY NEXT SIZE 32;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 169
此子句不能更改现有 extent 的大小。如果不卸装所有数据,就不能更改现有
extent 的大小。
要更改现有 extent 的大小,您必须卸装所有数据,删除表明仔数据库模式的
CREATE TABLE 定义中修改 first-extent 和 next-extent 的大小,重新创建数据
库并重新加载数据。关于如果优化 extent 大小的信息,请参阅 GBase 8s 性能指
南 。
LOCK MODE 子句
使用 LOCK MODE 关键字更改表的锁定粒度。
LOCK MODE 子句

下表描述了可用的锁定粒度选项。
粒度 作用
PAGE 在一整页的行上获取并释放一个锁
这是缺省锁定粒度。当您知道行分组到各页所依照的顺序与您正在用来
处理所有行的顺序相同时,页级别锁定就特别有用。例如,如果您依照
与表的集群索引相同的顺序来处理表的内容,页锁定就特别合适。
ROW 在每一行上获取并释放一个锁
行级别锁定提供最高级别的并发性。只有具有行级别锁定的表才支持
LAST COMMITTED 功能,当有另一个会话在您尝试读取的行上持有
互斥锁时,它会提高 Committed Read 和 Dirty Read 隔离级别的性
能。然而如果您正在一次使用许多行,则锁管理开销可能变得很重要。
根据您的数据库服务器的配置,也可以超出可用锁的最大数目。
以下语句更改将 customer 表的锁定方式更改为页级别锁定:
ALTER TABLE customer LOCK MODE(page);
下一示例将 customer 表的锁定方式更改为行级别说点:

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 170
ALTER TABLE customer LOCK MODE(row);
优先顺序和缺省行为
ALTER TABLE 语句中的 LOCK MODE 设置优先于
IFX_DEF_TABLE_LOCKMODE 环境变量和 DEF_TABLE_LOCKMODE 配置
参数的设置。有关 IFX_DEF_TABLE_LOCKMODE 环境变量的信息,请参阅
GBase 8s SQL 参考指南 。有关 DEF_TABLE_LOCKMODE 配置参数的信息,请
参阅 GBase 8s 管理员参考 。
ADD TYPE 子句
使用 ADD TYPE 子句将未基于指定的 ROW 数据类型的表转换为类型表。此子句是
SQL ANSI/ISO 标准的扩展。
ADD TYPE 子句

元素
描述
限制
语法
row_type
添加到表的 ROW 数
据类型的名称
该 row_type 字段必须与列
数据类型的顺序和数量相匹

标识符
当您使用 ADD TYPE 子句时,就将指定的已命名的 ROW 数据类型分配到所包
含的列与该数据类型的字段相匹配的表。
除了所有的 ALTER TABLE 操作的共同要求 (即数据库的 DBA 权限、表的 Alter
权限、表的所有权),当您使用 ADD TYPE 子句将一个未分类的表转换为指定的
ROW 数据类型时,以下所有的条件必须成立:

在数据库中该指定的 ROW 数据类型已存在。

您对指定的 ROW 数据类型持有 Usage 权限。

未分类表列的数据类型的顺序与指定 ROW 数据类型字段数据的顺序必
须 1 对 1 相对应。

该表不能是具有 rowid 值的分片表。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 171
您不能将 ADD TYPE 子句与任何更改表结构的子句相结合。在具有 ADD TYPE
子句的同一 ALTER TABLE 语句中,任何其它 ADD 、DROP 或 MODIFY 子
句都是无效的。ADD TYPE 子句不允许您更改列数据类型。(要更改列的数据类
型,请使用 MODIFY 子句。)
类型表上有效的选项
对于 ROW 数据类型的表 ALTER TABLE 只支持以下选项。
Typed-Table 选项

两个注意事项应用于为继承层次结构的一部分的类型表:

对于子表,ADD CONSTRAINT 和 DROP CONSTRAINT 对于继承的约
束是无效的。

对于超表,ADD CONSTRAINT 和 DROP CONSTRAINT 传播到所有子
表。