避免合法用户通过合法操作写入不正确的数据
数据的完整性:数据的正确性和相容性
实体完整性
-
create table中用primary key定义
-
单属性构成的码可以用列级约束条件或表级约束条件
create table student (sno char(9) primary key, sname char(20) not null, ssex char(2), sage smallint, sdept char(20));
-
多个属性构成的码只能用表级约束条件
create table sc (sno char(9) not null, cno char(4) not null, grade smallint, primary key(sno,cno));
-
实体完整性的检查和违约处理:对主码列进行插入或更新操作时,DBMS按照实体完整性规则自动进行检查。
- 检查主码值是否唯一,如果不唯一则拒绝插入或修改
- 检查主码的各个属性是否为空,只要由一个为空就拒绝插入或修改
参照完整性
-
再create table 中用foreign key短语定义哪些列为外码
-
用references短语指明这些外码参照那些表的主码
//关系SC中一个元组表示一个学生选修的某门课程的成绩,(Sno,Cno)是外码。Sno,Cno分别参照引用Student表的主码和Course表的主码 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));
-
参照完整性检查和违约处理:对被参照表和参照表进行增删改操作时有可能破坏参照完整性,必须进行检查
-
拒绝执行:不允许该操作执行, 该策略一般设置为默认策略
-
级联操作:当删除或修改被参照表student的一个元组造成了参照表sc的不一致,则删除或修改参照表所有不一致的元组
-
设置为空值:当删除或修改被参照表的一个元组造成了不一致,则将参照表中的所有造成不一致的元组的对应属性设置为空值
-
用户定义的完整性
-
列值非空 not null
//在定义SC表时,说明Sno、Cno、Grade属性不允许取空值 create table sc (sno char(9) not null cno char(4) not null grade smallint not null, primary key(sno,cno));
-
列值唯一 unique
//建立部门表DEPT,要求部门名称Dname列取值唯一,部门编号Deptno列为主码 create table dept (deptno numeric(2), dname char(9) unique, location char(10), primary key(deptno));
-
检查列值是否满足一个条件表达式 check
// Student 表的 Ssex只允许取“男”或“女” create table student (sno char(9) primary key, sname char(8) not null, ssex char(2) check(ssex in('男','女')), sage smallint, sdept char(20));