关系模型中关系的完整性约束简介

关系模型中关系的完整性约束简介

数据库中的数据必须是正确的、一致的、完整的和可靠的,为了防止数据库中存在不符合语义规定的数据和防止因输入错误数据造成的无效操作,有必要实施数据的完整性约束。

关系数据库,关系模型中三类完整性约束:

1 实体完整性

2 参照完整性

3 用户定义的完整性

附、触发器

【注:本文中的分类是比较常见的,也有不同的分类或说法,没有本质的不同】

 

一、实体完整性(Entity Integrity)

实体:即表中的一行(一条记录)代表一个实体(entity)

实体完整性的作用:标识每一行数据不重复。

约束类型:

主码约束(primary key)

唯一约束(unique)

其中常用的是主码约束。

 

主码约束

规定关系的主码(Primary Key)不能取空(NULL)值。这个规则称为实体完整性。

空值就是“不知道”或“无意义”的值。若主属性取空值,就说明存在某个不可标识的实体。

说明

实体完整性规则规定关系的主码(Primary Key)唯一标识表中的每行记录。主码约束有如下特点:每个表中只能有一个主码,主码可以是一列,也可以是多列的组合;主码值必须唯一并且不能为空,对于多列组合的主码,某列值可以重复不能取空值,列的组合值必须唯一。例:

选修(学号,课程号,成绩)

选修关系中,“学号、课程号”为主码,则两个属性都不能取空值

 

主码约束的例子:

CREATE TABLE student(

    id int primary key,

    name varchar(50)

);

 

第二种添加主码约束的方式,如果建立 student表时没有使用primary key,可以在其后使用下句建立外主码约束:

ALTER TABLE student ADD PRIMARY KEY (id);

 

唯一约束(unique)

特点:数据不能重复。

CREATE TABLE student(

    ​Id int primary key,

    ​Name varchar(50) unique

​);

 

二、参照完整性(Referential Integrity)

“专业”关系与“学生”关系之间存在一对多联系:

专业(专业号,专业名)

学生(学号,姓名,性别,专业号,年龄)

“专业”关系与“学生”关系建立外键约束后,学生关系中每个元组的“专业号”属性取值情况,只取下面两类值:

(1)空值,表示尚未给该学生分配专业

(2)非空值,这时该值必须是专业关系中某个元组的“专业号”值,表示该学生不可能分配到一个不存在的专业中

 

设F是基本关系R的一个或一组属性,但不是关系R的码。如果F与基本关系S的主码Ks相对应,则称F是基本关系R的外码(Foreign Key)。

基本关系R称为参照关系(Referencing Relation)

基本关系S称为被参照关系(Referenced Relation)或目标关系(Target Relation)。

说明

(1)关系R和S不一定是不同的关系

(2)被参照关系S的主码Ks 和参照关系的外码F必须定义在同一个(或一组)域上

(3)外码并不一定要与相应的主码同名

   当外码与相应的主码属于不同关系时,常常取相同的名字,以便于识别。

参照完整性规则

也称为外键约束

若属性(或属性组)F是基本关系R的外码

它与基本关系S的主码Ks相对应(基本关系R和S不一定是不同的关系),则对于R中每个元组在F上的值必须为:

 或者取空值(F的每个属性值均为空值)

 或者等于S中某个元组的主码值。

 

外键约束的例子:

CREATE TABLE student(

    ​sid int pirmary key,

  ​  name varchar(50) not null,

    ​sex varchar(2) default ‘男’

​);

CREATE TABLE score(

​        id int,

​        score int,

​        sid int , 

​        CONSTRAINT fk_score_sid FOREIGN KEY(sid) REFERENCES student(id)

​);

 

第二种添加外键方式,如果建立 score表时没有CONSTRAINT一句,可以在其后使用下句建立外键约束:

ALTER TABLE score ADD CONSTRAINT fk_score_sid FOREIGN KEY(sid) REFERENCES student(id)

 

建立外键约束后,DBMS将如下检查处理:

外键约束对子表如此检查处理:

在子表上进行INSERT、UPDATE操作的限制是,要和主表中的主键值匹配,或为NULL,否则不允许。

外键约束对父表如此检查处理:

在父表上进行UPDATE、DELETE操作的限制,取决于在定义子表的外键时指定的ON UPDATE、ON DELETE子句(不同的DBMS支持的情况不尽相同)。

对此更详细情况可参见:外键约束详解及术语释疑 https://blog.csdn.net/cnds123/article/details/39827049

 

三、用户自定义的完整性User-defined Integrity

也有人称为域完整性(Domain Integrity)。用户定义的完整性是针对某一具体关系数据库的约束条件,反映某一具体应用所涉及的数据必须满足的语义要求。

关系模型应提供定义和检验用户自定义的完整性的机制。

例:

课程(课程号,课程名,学分)

课程关系中

非主属性“课程名”也不能取空值

非主属性“学分”只能取值{1,2,3,4,5}

 

包括 非空约束(not null)、 默认值约束(default)、check约束

非空约束:not null

CREATE TABLE student(

    ​Id int pirmary key,

    ​Name varchar(50) not null,

    ​Sex varchar(2)

​);

 

默认值约束 default

CREATE TABLE student(

    ​Id int pirmary key,

    ​Name varchar(50) not null,

    ​Sex varchar(2) default ‘男’

​);

 

check约束(mysql不支持)

CREATE TABLE student(

    Id int pirmary key,

    Name varchar(50) not null,

    Sex varchar(2) default ‘男’,

    age tinyint CHECK(age>=18 AND age<=65)

);

 

顺便提示:sql 语句的关键字不区分大小写,大小写对系统来说都是没差别的,为方便人的阅读建议大写关键字,但本文并未严格遵守。

 

附、触发器

触发器(Trigger)是和表关联的特殊的存储过程,可以在插入,删除或修改表中的数据时触发执行,触发器经常用于加强数据的完整性约束和业务规则等。

触发器的功能一般比完整性约束要强得多。一般而言,在完整性约束功能中,当系统检查出数据中有违反完整性约束条件时,则仅给出必要提示以通知用户,仅此而已。而触发器的功能则不仅仅起提示作用,它还会引起系统内自动进行某些操作以消除违反完整性约束条件所引起的负面影响。

触发器除了有完整性保护功能外,还有安全性保护功能。

关于 触发器详细情况可见 https://blog.51cto.com/9291927/2095105

 

猜你喜欢

转载自blog.csdn.net/cnds123/article/details/114336832