1
数据库原理与应用技术
1.7.3.3 6.3.3 SQL中的完整性约束
6.3.3 SQL中的完整性约束

在SQL中,各种完整性约束都是数据库模式定义的一部分。这些完整性约束可以大大提高完整性检测的效率,有效防止对数据库的意外破坏,同时,也大大减少了编程人员的任务。

对完整性约束的设置及检测,可以采取不同的方式加以实现。

1. 主键约束

主键约束是数据库中最重要的一种约束。在基本表中,主键不允许空,也不允许重复出现。

1)主键约束的形式

(1) 主键子句,PRIMARY KEY(键)。

(2) 主键短语,在属性定义后加上PRIMARY KEY。

2)主键约束的定义

UNIQUE(<列名序列>)或PRIMARY KEY(<列名序列>)

其中,需要注意以下两点。

(1) UNIQUE方式定义了表的候选键,表示了值是唯一的,若还有值非空的约束,则还需在列定义时带有选项NOT NULL。

(2) PRIMARY方式定义了表的主键。一个基本表只能指定一个主键。如果是主键,则指定的列会自动认为是非空的。

2. 外键约束

外键约束的定义如下:

FOREIGN KEY(<列名序列>)REFERENCES <参照表> [(<列名序列>)]

[ ON DELETE <参照动作> ]

[ ON UPDATE <参照动作> ]

其中,需要注意的是:第一个列名序列是外键,第二个列名序列是参照表中的主键或候选键。

例如,属性p在基本表s1中是主键,在表s2中是外键。根据引用完整性规则,表s2中的p值或是空值或是表s1中的p值。如果在表s2中p作为主键的一部分,则不允许p出现空值。在实际系统中,作为主键的关系称为参照关系,作为外键的关系称为“依赖关系”。基本关系的操作(删除参照表中元组)会影响依赖关系,参照动作可以有以下五种方式。

(1) NO ACTION方式:对依赖表没有影响。

(2) CASCADE方式:将依赖表中所有外键值与参照表中要删除的主键值相对应的元组一起删除。

(3) RESTRICT方式:只有当依赖表中没有外键值与要删除的参照表中主键值相对应时,系统才能执行删除操作,否则拒绝此删除操作。

(4) SET NULL方式:删除参照表中元组时,将依赖表中所有与参照表中被删除主键值相对应的外键值均置为空值。

(5) SET DEFAULT方式:与SET NULL方式类似,只要把外键值均置为预先定义好的默认值。

3. 属性值上的约束

属性值上的约束有以下三种:

(1) 非空值约束,属性定义后加上“NOT NULL”。

(2) 基于属性的检查子句(CHECK子句)。

(3) 域约束子句,在CREATE DOMAIN后加CHECK子句。

需要提醒用户的是,复杂条件的检查(CHECK)子句应有节制地使用,因为CHECK测试很花时间,会降低系统的运行效率。

4. 全局约束

全局约束有以下两种。

(1) 基于元组的检查子句是对单个关系的元组值加以约束。方法是在关系定义的任何地方加上CHECK和约束的条件。

(2) 若完整性约束涉及多个关系或与聚合操作有关,则SQL会提供断言机制。SQL提供的这种机制能使用户更加灵活地编写完整性规则。

创建断言定义为:

CREATE ASSERTION(断言名)CHECK(条件)

撤销断言定义为:

DROP ASSERTION <断言名>

5. 对约束的命名、撤销和添加操作

(1) 对约束的命名。断言在创建时已命名,其他约束在定义前加上“CONSTRAINT 约束名”。

(2) 约束的撤销与添加。撤销的定义为:

ALTER…DROP…

添加的定义为:

ALTER…ADD…

(3) 断言的撤销的定义为:

DROP ASSERTION (断言名)