基本概念
完整性约束主要包括
- 实体完整性
- 参照完整性
- 用户自定义完整性
实体完整性
关系模型中实体完整性通常在建表时候添加primary key完成
# primary key定义
create table tab(
xxxx primary key, # 列级完整性约束定义
xxxx,
xxxx....
)
create table tab(
xxx,
xxx,
xxx,
primary key (var1, var2,.....) # 表级完整性约束定义,如果有多个只能在表级定义
)
- 主键必须唯一,如果不唯一拒绝插入或修改
- 主键各个属性不允许为空,只要有一个为空拒绝插入或修改
保证主键上述两种特点,DBMS主要采取以下方式:
- 全表扫描
- 索引
参照完整性
关系模型用foreign key保证
# 外键定义
create table sc(
xxxx,
xxxx,
xxxx,
foreign key (var1) references xx_tab(var2) # 在表级定义参照完整性
on delete cascade # 删除时候级联(被参照表)
on update no action # 在更新时候拒绝(被参照表)
)
违规处理
- 修改参照表只要涉及外键字段,例如插入元组、修改外码值,都会直接拒绝
- 对于被参照表,如果是删除元组或者修改主码值,可以拒绝可以级联可以设置为空值
用户自定义完整性
约束条件定义
- 列值非空(not null)
- 列值唯一(unique)
- 列值上是否符合表达式(check)
# 主要说明check定义
create table tab(
xxx,
xxx,
xxx,
sex char(2) check(sex in ('男', '女')), # 定死性别只能取男或者女
xxx
)
# check也可以在元组上定义完整性约束
create table tab(
xxx,
xxx,
xxx,
check (sex = '女' or name not like 'Ms.%') # 定义name与sex两个属性之间的约束条件
)
- 如果约束条件不被满足,DBMS直接拒绝执行
完整性约束命名字句
# constaint语句
constraint <完整性约束条件名称>
[primary key 短语
|foreign key 短语
|check 短语]
# e.g.
create table tab(
sno numeric(6)
constraint c1 check (sno between 90000 and 99999),
sname char(20),
constraint c2 not null,
sage numeric(3),
constraint c3 check(sage < 30),
xx,
constraint studentkey primary key (sno)
)
alter table tab
add constraint c1 check xxxx
alter table tab
drop constraint c1
- constraint可以定义任何一种完整性约束,而且为其表面名称,好处是名称自定义,可以进行删除约束条件。
- 如果像上面直接给出not null,unique等条件,SqlServer会自动为其添加名称,一般名称都有规律。像主键约束一般叫pk_xxxx。