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

  • Post author:
  • Post category:其他





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






使用 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);

有关约束名称的说明,请参阅声明约束名称 。




唯一约束和唯一索引的区别


尽管唯一索引和唯一约束的功能相似,除了在声明、更改或销毁它们的语法之间的各种不同,还有在这两种的数据库对象之间的其它不同:

  1. 在 DDL 语句中,它们注册于或删除系统目录的不同表。
  2. 在 DML 语句中,在日志记录的表上启用唯一约束会在语句末尾被检查,但是唯一索引是一行一行的检查,从而防止可能潜在地违反指定列(或者对于多列列约束或索引是列列表)的唯一性的行的插入或更改。

例如,当您将值 1 、2 和 3 存储在具有 INT 列的日志记录表的行中,如果列 c 上有一个唯一索引,则对该表上指定的 SET c = c + 1 UPDATE 操作将发生错误而失败,但是如果该列是具有一个唯一约束的话,该语句会成功。




使用 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 子句


元素


描述


限制


语法




column


被引用列

请参阅 引用约束的限制

标识符




table


被参考表

必须与引用表驻留在相同的数据库中

标识符




引用



列(定义的列)是对被引用的列或一组列的集合进行引用的列或一组列的集合。引用列中可以包含 NULL 和重复值,但是被引用的列(或列的集合)中的值必须是唯一的。

被引用列和引用列之间的关系被称为



父 — 子



关系,其中父亲是被引用的列(主键),孩子是引用列(外键)。引用约束将建立这人父 — 子关系。

当您创建了引用约束后,数据库服务器将自动在受约束的列上创建内部索引。




引用约束的限制


您必须具有 References 特权来创建引用约束。

当您使用 REFERENCES 子句时,您必须注意下列限制:

  • 被引用表和引用表必须在同一数据库中。
  • 被引用列(当你使用多列约束格式时列的集合)必须具有唯一或主键约束
  • 引用列和被引用列的数据类型必须相同。

唯一的例外是如果被参考列是 serial 数据类型,则参考列必须为整数数据类型:

    • 对于 BIGSERIAL 被引用的列,使用 BIGINT 引用列。
    • 对于 SERIAL 被引用的列,使用 INT 引用列。
    • 对于 SERIAL8 被引用列,使用 INT8 引用列。
  • 不能在 RAW B表的任何列上放置约束。
  • 不能在 BYTE 、TEXT 、BLOB 或 CLOB 列上放置引用约束。
  • 如果使用单列约束格式,您只能引用一列。
  • 如果使用多列约束格式,则 REFERENCES 子句中列的最大数目是 16 ,并且如果页大小为 2 千字节时,这些列的总长度不能超过 390 字节。(最大长度随着页大小增加而增加。)



版权声明:本文为m0_67317773原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。