南大通用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);
有关约束名称的说明,请参阅声明约束名称 。
唯一约束和唯一索引的区别
尽管唯一索引和唯一约束的功能相似,除了在声明、更改或销毁它们的语法之间的各种不同,还有在这两种的数据库对象之间的其它不同:
- 在 DDL 语句中,它们注册于或删除系统目录的不同表。
- 在 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 子句
|
|
|
|
|
被引用列 |
请参阅 引用约束的限制 |
标识符 |
|
被参考表 |
必须与引用表驻留在相同的数据库中 |
标识符 |
引用
列(定义的列)是对被引用的列或一组列的集合进行引用的列或一组列的集合。引用列中可以包含 NULL 和重复值,但是被引用的列(或列的集合)中的值必须是唯一的。
被引用列和引用列之间的关系被称为
父 — 子
关系,其中父亲是被引用的列(主键),孩子是引用列(外键)。引用约束将建立这人父 — 子关系。
当您创建了引用约束后,数据库服务器将自动在受约束的列上创建内部索引。
引用约束的限制
您必须具有 References 特权来创建引用约束。
当您使用 REFERENCES 子句时,您必须注意下列限制:
- 被引用表和引用表必须在同一数据库中。
- 被引用列(当你使用多列约束格式时列的集合)必须具有唯一或主键约束
- 引用列和被引用列的数据类型必须相同。
唯一的例外是如果被参考列是 serial 数据类型,则参考列必须为整数数据类型:
-
- 对于 BIGSERIAL 被引用的列,使用 BIGINT 引用列。
- 对于 SERIAL 被引用的列,使用 INT 引用列。
- 对于 SERIAL8 被引用列,使用 INT8 引用列。
- 不能在 RAW B表的任何列上放置约束。
- 不能在 BYTE 、TEXT 、BLOB 或 CLOB 列上放置引用约束。
- 如果使用单列约束格式,您只能引用一列。
- 如果使用多列约束格式,则 REFERENCES 子句中列的最大数目是 16 ,并且如果页大小为 2 千字节时,这些列的总长度不能超过 390 字节。(最大长度随着页大小增加而增加。)