定义:完整性控制是指保护数据库的数据正确性和有效性,防止不符合语义约束的数据破坏数据库并且保证数据是完整的,可用的。

 

1. 数据的完整性

提供一种机制来检验数据库中的数据是否满足语义的要求。

数据的完整性包含4个方面的内容:

(1)实体完整性entity integrity:防止数据库中有重复的数据存在。

针对主键约束primary key、外键约束foreign key、唯一约束unique。

(2)域完整性domain integrity:防止用户输入不合法的数值或者非空数值等。

如Not null、check来实现。

(3)参照完整性referential integrity:防止多个相关表之间的数据不一致。

可以使用设置主键primary key、外键foreign key来实现。

(4)用户自定义完整性user-defined integrity:解决系统提供的完整性控制无法是实现的需求。

 

完整性约束的3种类型:

(1)与表相关的约束:在表中定义的约束。可使用not null、primary key、unique、foreign key、check。

(2)域约束:在域中定义的约束。只能使用check。

(3)断言:定义断言时的约束。只能使用check。

 

2.各种约束的使用与定义。

(1)和表相关的约束

表约束与字段约束的定义与区别:表约束是指使用表约束的语法来定义[constraint 约束名] <约束类型>(字段名1,字段名2,。。。,字段名n);字段约束是指将约束定义在字段后,例如(非空not null):<字段名><字段类型>[其他定义][NOT NULL]。

唯一约束(unique):用于表中的非主键字段,确保一个或者多个字段的完整性。系统将自动为UNIQUE字段创建唯一 索引。

唯一约束的使用范围:字段约束、表约束。

(1)字段约束:<字段名><字段类型>[其他定义][unique]

使用在字段中时,可以使用空值NULL,但是这个值只能出现一次。

(2)表约束:

这里的表约束并非主键字段,而是使用了主键约束的定义方式,语法如下:

Primary key (id)

Constraint xh unique (xh)

主键约束(primary key):确保一个或者多个字段在数据库表中的唯一性,不具有重复值。

范围:字段约束、表约束,即可以在定义在字段后,也可以定义在表的末尾。

注:主键约束与唯一约束的区别:1.一个表只能有一个主键,但可以有多个唯一约束。2.唯一约束的值可以有一个NULL空值,但主键不可以有空值。

外键约束(foreign key):外键约束定义的是一个表中的一个或者多个字段与其他表中的字段的数据的联系,保证数据的完整性,是和主键primary key或者unique结合使用的。

包含外键的表成为子表,外键引用的主键的表成为父表。

外键对应的父表中的字段必须是主键或者唯一约束字段。

外键的值必须参照附表中引用的字段的值,或者为NULL,不可以是其他数据值,如果要取消附表中的主键或者unique,必须先取消他们的外键。一个表中如果有多个外键都是引用一个父表的主键或者unique,那么这个子表中的某个实体中有一个外键字段为null,则这个实体中的其他外键字段值将不被完整性约束检查,值可以不引用父表中的主键的值,解决方案:对子表中设置外键约束的字段设置not null约束。

外键的使用方法:

字段约束:<字段名><字段类型>[其他定义]references 父表名(父表中的主键字段)

表约束:constraint constraint_name foreign key(字段名) references 父表名(字段名)。

校验约束(check):校验约束的作用是防止用户向某个字段输入非法数据。

使用方式:

字段约束:<字段名><字段类型>[其他定义]check(搜索条件)

表约束:constraint constraint_name check(搜索条件)

也可以通过alter添加一个校验约束。

(2)域约束:只能使用check

域是数据表中为字段定义的类似于数据类型的数据的集合,是用户定义的数据对象,用于对字段数据的约束。

定义格式:create domain domain_name [as] data_type

[default default_expr]

[constraint constraint_name]

Null|not null

Check(value condition expression)

经过定义之后,domain_name就成为了一种数据类型,可以在定义字段是使用。

注:SQL SERVER不支持域约束。

(3)断言约束:只能使用check

断言是对表中符合条件的字段进行约束,是一种全局约束。

格式:create assertion <断言名> check(<条件>)

在check中对一个表的某个字段进行设定条件,之后任何操作,涉及这字段,则会对条件进行比对,true则可以通过操作,false则不通过操作。

Create assertion a1 check(course.xh in(select xh from student where xm is not null))

注:SQL SERVER不支持域约束。