文章目录
数据库的完整性是指数据的正确性和相容性。 数据的正确性是指数据是否符合现实世界语义、反映当前实际状况;数据的相容性是指数据库同一对象在不同关系表中的数据是符合逻辑。
5.1 实体完整性
关系模型的实体完整性在CREATE TABLE中用 PRIMARY KEY定义,分为列级约束条件和表级约束条件。定义完成后,需要检查:
(1)主码值是否唯一,如果不唯一则拒绝插入或修改。
(2)主码的各个属性是否为空,只要有一个为空就拒绝插入或修改。
例题5.1:将Student表中的Sno属性定义为码。
1)在列级定义码:
create table Student
(Sno char(9) primary key,
Sname char(20) not null,
Ssex char(2),
Sage smallint,
Sdept char(20));
或
2)在表级定义码:
create table Student
(Sno char(9),
Sname char(20) not null,
Ssex char(2),
Sage smallint,
Sdept char(20)
primary key(Sno));
例题5.2:将SC表中的Sno、Cno属性组定义为码。
create table SC
(Sno char(9) not null,
Cno char(4) not null,
Grade smallint,
primary key (Sno,Cno)
);
//只能在表级定义主码
5.2 参照完整性
关系模型的参照完整性在CREATE TABLE 中用FOREIGN KEY短语定义那些列为外码,用REFERENCES短语指明这些外码参照那些表的主码。
例题5.3 定义SC中的参照完整性
create table SC
(Sno char(9) not null,
Cno char(4) not null,
Grade smallint,
primary key (Sno,Cno),
foreign key(Sno)references Student(Sno),
foreign key(Cno)references Course(Cno)
);
例5.4 显示说明参照完整性的违约处理示例
create table SC
(Sno char(9) not null,
Cno char(4) not null,
Grade smallint,
primary key (Sno,Cno),
/*在表级定义实体完整性,Sno、Cno都不能取空值*/
foreign key(Sno) references Student(Sno)
/*在表级定义参照完整性*/
on delete cascade
/*删除Student元组时,级联删除SC表中相应的元组*/
on update cascade
/*Student表更新Sno时,级联更新SC表中相应的元组*/
foreign key(Cno) references Course(Cno)
/*在表级定义参照完整性*/
on delete no action
/*当删除Course表中的元组导致与SC表不一致时拒绝删除*/
on update cascade
/*当更新Course表中的Cno时级联更新SC表中相应的元组*/
);
5.3 用户定义的完整性
5.3.1 属性上的约束条件
在CREATE TABLE中定义属性的同时,根据应用要求定义属性上的约束条件,包括:
· 列值非空(not null)
· 列值唯一(unique)
· 检查列值是否满足一个条件表达式(check短语)
例5.5:在定义SC表时,说明Sno、Cno、Grade 属性不允许取空值。
create table SC
(Sno char(9) not null, //Sno不能为空
Cno char(4) not null, //Cno不能为空
Grade smallint not null, //Grade不能为空
primary key (Sno,Cno),
……
);
例5.6:建立部门表DEPT,要求部门名称 Dname 列取值唯一,部门编号Deptno列为主码。
create table DEPT
(Deptno numeric(2),
Dname char(9)