完整性约束
完整性约束是加在数据库上的一个具体条件
4.1 完整性约束的分类
- 类型约束
- 属性约束
- 关系变量约束
- 数据库约束
4.2 完整性约束的定义
4.2.1 Primary Keys约束
一个关系只能有一个主键
定义方法:
- 在一个属性的类型定义完毕后,直接在后面加上PRIMARY KEY。
- 在所有属性定义完毕后,增加一个PRIMARY KEY的声明,指出主键包含哪些属性。
4.2.2 UNIQUE约束
- 在一个关系中,PRIMARY KEY只有一个,而UNIQUE可以声明多个
- PRIMARY KEY要求属性取值不能为NULL ,而UNIQUE允许属性取空值
4.2.3 NOT NULL 约束
禁止在该属性上插入一个空值。
4.2.3 CHECK 约束
CHECK子句的通常应用是保证属性值满足指定的条件。
CHECK子句括号内的条件可以是取值的简单限制,也可以是带WHERE条件的SQL语句。将复杂的约束条件附加在属性声明之后。
4.2.5 FOREIGN-KEY 约束
1.外码的声明
-
若外码为单属性,则可以在属性名称、类型声明之后,用REFERENCES指出被参照的关系、属性
-
在CREATE TABLE定义语句的属性列描述后,将一个或多个属性列声明为外码
2. 参照完整性约束的保证
-
受限策略
这是系统的默认方式。当出现违背参照完整性规则的更新操作请求时,系统拒绝执行该操作。
-
置空策略
-
级联策略
4.2.6 域约束
通过CREATE DOMAIN可以定义一个新的域,通过对域进行约束可以达到对属性列取值的约束。
4.2.7 断言
4.3 完整性约束的修改
操作 | 语句 | 备注 |
---|---|---|
约束的命名 | CONSTRAINT + 约束名称 | |
约束的修改 | ALTER DOMAIN | DROP CONSTRAINT 删除约束 ADD CONSTRAINT 增加约束 |
4.4 完整性约束的验证
任何约束都可以声明为DEFERRABLE(可延迟的)或NOT DEFERRABLE(不可延迟的)。这两个关键字设置该约束是否可推迟,一个不可延迟的约束在每条SQL语句执行后都必须校验是否违反约束规则。可延迟的意味着,当事务开始后,对约束的检查可以推迟到晚些时候,但不晚于当前事务的结束(使用SET CONSTRAINTS命令)时。默认是NOT DEFERRABLE。
如果约束是可推迟的,可进一步声明为INITIALLY IMMEDIATE(初始化立即执行)或INITIALLY DEFERRED(初始化延迟执行)。这个子句声明检查约束的默认时间。如果约束是INITIALLY IMMEDIATE,那么每条语句之后就检查它,这个是默认。如果约束是INITIALLY DEFERRED,那么只有在事务结尾才检查它。约束检查的时间可以用SET CONSTRAINTS命令修改。