南大通用GBase8s 常用SQL语句(七十六)
定义组合的主键和外键
当您使用多列约束格式时,可以创建一个组合关键字。组合关键字指定多列的主键或外键约束。
以下示例创建两个表。第一个表的组合关键字表现为主键。第二表的组合关键字表现为外键。
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
约束缺省的索引创建策略
当您创建带有唯一或主键约束的表时,数据库服务器为每一个约束创建一个唯一并升序的内部索引。
当创建带有引用约束的表时,数据库服务器创建一个升序的内部索引,它允许引用约束中您指定的每一列有重复的值。
内部索引占据与其表相同的存储位置。对于已分片的表,内部索引的分片占据与您为此表分片指定的相同的 dbspace 分区(或者在某些情况下,为数据库 dbspace)。
如果您需要索引分片策略独立于底层表分片,则创建该表时不要定义此约束。而使用 CREATE INDEX 语句创建具有期望分片存储策略的唯一索引。然后使用 ALTER TABLE 语句添加约束。新的约束使用先前定义的索引。
重要: 在非日志记录的数据库中,detached checking 是唯一可用的约束检查。已拆离检查意味着一行一行地进行约束检查。
Options 子句
CREATE TABLE 语句的 Options 子句提供创建各类隐藏列的选项。支持行级别审计、基于标签的安全策略、存储位置、分布存储策略、页扩展大小、锁定粒度、用户定义的存取方法和可影响列分布统计信息集合的属性。
Options
表选项的顺序
此语法图显示了包含多个下列选项的 CREATE TABLE 语句中表选项的顺序:
- WITH 选项
- SECURITY POLICY 选项
- 存储选项
- LOCK MODE 选项
- USING Access-Method 子句
- 统计信息选项。
如果您包含了多个 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