原创
数据库完整性约束分为三种:实体完整性约束、参照完整性约束、用户定义的完整性
实体完整性
规则:若属性(指一个或一组属性)A是基本关系R的主属性,则A不能取空值。所谓空值
就是”不知道“或”不存在“或”无意义“的值。
意思十分明显,就是关系中的主码是不能取空值的
参照完整性
定义:设F施基本关系R的一个或一组属性,但不是关系R的码,KS是基本关系S的主码。
如果F与KS相对应,则称F是R的外码,并称基本关系R为参照关系,基本关系S为被参照
关系或目标关系。
规则:若属性(或属性组)F是基本关系R的外码,它与基本关系S的主码KS相对应,则对于
R中每个元组在F上的值必须:
- 或者取空值
- 或者等于S中某个元祖的主码值
用户定义的完整性
任何关系数据库系统都应该支持实体完整性和参照完整性。除此之外,不同的关系数据库系统根据
其应用环境的不同,往往还需要一些特殊的约束条件。用户定义的完整性就是针对某一具体关系数
据库的约束条件,它反映某一具体应用所涉及的数据必须满足的语义要求。
定义实体完整性
关系模型的实体完整性在CREATE TABLE中用PRIMARY KEY定义。对单属性构成的码有两种说明方法,
一种是定义为列级约束条件,另一种是定义为表级约束条件。对多个属性构成的码只有一种说明方法,即
定义为表级约束条件。
/*建立Student表*/ create table Student( sno char(9) primary key, //在列级定义主码 sname char(20) not null, ssex char(2), sage smallint, sdept char(20) ); /*建立Course表*/ create table Course( cno char(9), cname char(20) primary key(cno) //在表级定义主码 )
实体完整性检查:
- 检查主码值是否唯一,如果不唯一则拒绝插入或修改。
- 检查主码的各个属性是否为空,只有有一个为空就拒绝插入或修改。
定义参照完整性
关系模型的参照完整性在CREATE TABLE中用FOREIGN KEY短语定义哪些列为外码,用
REFERENCES短语指明这些外码参照哪些表的主码。
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), //在表级定义参数完整性 );
参照完整性违约处理
- 拒绝(NO ACTION)执行(系统默认)
- 级联(CASCADE)操作
- 设置为空值
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), //在表级定义参照完整性 ON DELETE CASCADE //级联删除 ON UPDATE CASCADE, //级联更新 foreign key(cno) references Course(cno), //在表级定义参数完整性 ON DELETE NO ACTION //拒绝删除 ON UPDATE CASCADE //级联更新 );
用户定义的完整性
- 属性上的约束条件(列值非空(NO NULL)、列值唯一(UNIQUE)、检查列值是否满足一个条件表达式(CHECK短语))。
ssex char(2) check(ssex in('男','女')),
- 元组上的约束条件
create table Student( sno char(9) primary key, //在列级定义主码 sname char(20) not null, ssex char(2) sage smallint, sdept char(20) check(ssex='女' or sname not like'Ms.%') );
10:50:01
2018-12-06