南大通用GBase8s 常用SQL语句(六十九)
CREATE TABLE 的其它语法说明
对于在新的永久性表中存储一个查询的结果集的 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 管理员指南。
列定义
使用 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)的任何显式或缺省存储大小规范以字节为单位进行解释。
将大小声明解释为逻辑字符语义可降低 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 关键字。
如果您将表的一列定义为已命名的 ROW 类型,则该表不会采用该已命名的 ROW 的任何约束。
列安全子句
使用列安全子句给列添加基于标签的行级别安全保护。
列安全子句
元素 | 描述 | 限制 | 语法 |
label | 安全标签的名称 | 必须存在其必须属于保护此表的安全策略 | 标识符 |
列安全子句可以添加基于标签的行级别保护。该子句只对受安全策略保护的表有效。有关基于标签的安全策略和表关联的语法,请参阅 SECURITY POLICY 子句。
安全标签可以是保护该表其它行或列的相同的标签,或者它可以是同一安全策略的不同标签。以下限制应用于 SECURED WITH 子句:
- 该列不能是 IDSSECURITYLABEL 类型。
- 指定没有策略限定符的标签,不是 policy.label 。
- 该标签必须是保护该表的安全策略的标签。