实体完整性
- 实体完整性:主码中的属性的值不能为空,不能重复
- 列级约束,表级约束这种约束一个表里只能出现一种,且只能出现一次
- 列级约束:定义单个属性为主码
create table Student
( Sno char(9) primary key, //列级约束
Sname char(20) not null,
Sage smallint
);
- 表级约束:定义单个或多个属性为主码
create table Student
( Sno char(9),
Sname char(20) not null,
Sage smallint,
primary key(Sno,Sname) //表级约束
);
违约处理
- 拒接插入记录或拒接对主码中属性的值的修改
补充: 在主码上建立索引,是为了避免对基本表进行全表扫描(该方法用来检查记录中的主码值是否为空)
参照完整性
- 参照完整性:外码的值要么为空(如果允许)要么与被参照关系的主码相等
- 在定义外码时,还要定义外码列是否允许空值
- 表级约束:定义单个属性为外码
create table Student
( Sno char(9) not null,
Sname char(20) not null,
Sage smallint,
primary key(Sno,Sname)
//Sno是外码,参照表Student的主码Sno列
foreign key(Sno) references Student(Sno),
on delete cascade //级联删除
foreign key(Sname) references Student(Sname)
on update cascade //级联修改
);
违约处理
-
拒绝(NO ACTION)执行
不允许该操作执行(默认的) -
级联(CASCADE)操作
当删除或修改被参照表的一个元组造成了与参照表的不一致,则删除或修改参照表中的所有造成不一致的元组 -
设置为空值(SET-NULL)
当删除或修改被参照表的一个元组时造成了不一致,则将参照表中的所有造成不一致的元组的对应属性设置为空值。
自定义完整性
- 属性上的约束
- 列值非空(not null)
- 列值唯一(unique)
- 检查列值是否满足一个条件表达式(check)
create table Student
( Sno char(9) unique, //唯一
Sname char(20) not null, //非空
Sage smallint check(Sage <100)
);
- 元组上的约束
- check语句不跟在属性后面,而是单独作为一句
create table Student
( Sno char(9),
Sname char(20) ,
Sex char(2),
Sage smallint ,
check (Sex='女' or Sname not like 'Ms.%')
);
违约处理
- 不满足约束拒接执行
完整性约束命名与删除
-
命名:constraint c1 check(Sex in (‘男’,‘女’)) //将该约束命名为c1
-
删除: drop constraint c1 //删除约束c1
-
修改(先删后加): add constraint c1 check(Sex in (‘男’,‘女’))
断言(考试不考)
- create assertion c1 check(Sex in (‘男’,‘女’)) //创建断言
- drop assertion c1 //删除断言c1