完整性约束
域完整性、实体完整性、参照完整性、用户定义完整性
关系完整性是为保证数据库中数据的正确性和相容性,对关系模型提出的某种约束条件或规则。如果数据不正确,那么一开始就不应该添加到表中。
完整性通常包括域完整性,实体完整性、参照完整性和用户定义完整性,其中域完整性,实体完整性和参照完整性,是关系模型必须满足的完整性约束条件。
域完整性
是指表中的列必须满足某种特定的数据类型约束,其中约束又包括取值范围、精度等规定。
实体完整性
实体完整性要求每个表都有唯一标识符,每一个关系(表)中的主键字段不能为空或者重复的值。
一个关系对应现实世界中一个实体集。现实世界中的实体是可以相互区分、识别的,也就是说它们应该具有某种惟一性标识。在关系模式中,以主关键字作为惟一性标识,而主关键字中的属性(称为主属性)不能取空值,否则,表明关系模式中存在着不可标识的实体(因空值是“不确定"的),这与现实世界的实际情况相矛盾,这样的实体就不是一个完整实体。按照实体完整性规则要求,主属性不得取空值,如主关键字是多个属性的组合,则所有主属性均不得取空值。
如员工表将编号作为主关键字,那么,该列不得有空值,否则无法对应到某个具体的员工,这样的表格不完整,对应关系不符合实体完整性规则的约束条件。
参照完整性
参照完整性要求关系中不允许引用不存在的实体。需设定相应的更新删除插入规则来更新参照表。参照完整性的定义建立在关系之间联系的主关键字与被外部关键字引用的约束条件下。
关系数据库中通常都包含多个存在相互联系的关系,关系与关系之间的联系是通过公共属性来实现的。所谓公共属性,它是一个关系R(称为被参照关系或目标关系)的主关键字,同时又是另一关系K(称为参照关系)的外部关键字。参照关系K中外部关键字的取值,要么与被参照关系R中某元组主关键字的值相同,要么取空值,那么,这两个关系间建立关联的主关键字和外部关键字引用,符合参照完整性规则要求。如果参照关系K的外部关键字也是其主关键字,根据实体完整性要求,主关键字不得取空值,因此,参照关系K外部关键字的取值实际上只能取相应被参照关系R中已经存在的主关键字值。
在学生管理数据库中,如果将选课表作为参照关系,学生表作为被参照关系,“学号”作为两个关系进行关联的属性,则“学号"是学生关系的主关键字,是选课关系的外部关键字。选课关系通过外部关键字“学号”参照学生关系。如果学生表中删除一行,那么选课表也应该删除对应的行或者置空这一行,如果“学号"同时也是选课表的主键,那么,根据实体完整性约束,选课表只能删除对应的行,而不能置空。
用户定义完整性
实体完整性和参照完整性适用于任何关系型数据库系统,它主要是针对关系的主关键字和外部关键字取值必须有效而做出的约束。
用户自定义完整性是针对某一具体关系数据库的约束条件,他反应某一具体应用所涉及的数据必须满足的语义要求。这一约束机制一般不应由应用程序提供,而应有由关系模型提供定义并检验,用户定义完整性主要包括字段有效性约束和记录有效性约束等。
也就是说,某个表,你设置这一列为null,not null,default,check等。包括:非空约束、唯一约束、检查约束、主键约束 、外键约束。
① 非空约束(Not Null Constraint) 就是有些列不能设置为空。
② 唯一约束(Unique Constraint)直接在字段定义后加入UNIQUE即可定义唯一约束。UNIQUE 约束唯一标识数据库表中的每条记录。
③ 检查约束(The Check Clause) 通过在定义数据库表里,在字段级或者是在表级加入的检查约束,使其满足特定的要求。
④ 主键约束(Primary Key Constraint) 其实主键约束就是一张表只能建立一个主键约束,其实就是唯一约束+非空约束。
⑤ 外健约束( Foreign Key Constraint) Foreign Key Constraint主要是确保同一个表或者不同表之间的引用完整性。
✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍扩展阅读✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍
UNIQUE KEY、UNIQUE约束、UNIQUE索引、PRIMARY KEY
UNIQUE KEY 也就是UNIQUE约束,是一个唯一非聚集索引。
UNIQUE索引包含了UNIQUE约束,因为UNIQUE约束是通过UNIQUE索引实现的。为了实现唯一约束,数据库会强制定义一个唯一索引在数据库上面。
PRIMARY KEY 拥有自动定义的 UNIQUE 约束。
每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。主键字段不允许为NULL ,UNIQUE允许为NULL。UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。
三者相同点
保证了往表中插入重复列值的操作都会失败。
三者的区别
区别在于建立和删除上,索引是使用 create/drop index 创建和删除的。
--oracle --创建索引、删除索引 Create index student_id on student(stu_id); Drop index student_id;
约束是使用 alter table tb add constraint 建立,使用 alter table tb drop constraint 删除 。
--oracle --创建、删除唯一性约束 Alter table student add constraint student_id unique(stu_id); Alter table student drop constraint student_id;
主键使用alter table tb add constraint……primary key创建,使用alter table tb drop primary key删除。
--oracle --创建主键、删除主键 Alter table student add constraint student_id primary key(stu_id); Alter table student drop primary key;
✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍扩展阅读✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍✍