南大通用GBase8s 常用SQL语句(七十六)

本文介绍了如何在数据库中创建组合主键和外键,以实现多列约束。示例展示了在两个表之间定义这种约束的方式,以及数据库服务器在约束检查、索引创建和存储策略方面的默认行为。此外,还讨论了CREATE TABLE语句的Options子句,包括行级别审计、安全策略、存储和锁定选项,以及统计信息的设置。
摘要由CSDN通过智能技术生成

南大通用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 语句中表选项的顺序:

  1. WITH 选项
  2. SECURITY POLICY 选项
  3. 存储选项
  4. LOCK MODE 选项
  5. USING Access-Method 子句
  6. 统计信息选项。

如果您包含了多个 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值