数据库的完整性——实体完整性、参照完整性、属性约束条件命名子句、域

数据库的完整性

防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据;
防范对象:不合语义的、不正确的数据

  • 为了维护数据库的完整性,DBMS必须:
    1、 提供完整性约束条件的机制;
    2、提供完整性检查的方法;
    3、违约处理;

一、实体完整性

1、定义实体完整性

关系模型的实体完整性
CREATE TABLE 时用 PRIMARY KEY定义

单属性构成的码有两种定义方法:

  • 定义为列级约束条件 即在属性的后边定义

举个例子:将Student表中的Sno属性定义为码

CREATE TABLE Student(
Sno CHAR(9) PRIMARY KEY 
Sname CHAR(4) ,
Ssex CHAR(2) ,
Sage SMALLINT ,
Sdept CHAR(2)
);
  • 定义为表级约束条件 即在最后声明谁是码

举个例子:将Student表中的Sno属性定义为码

CREATE TABLE Student(
Sno CHAR(9),
Sname CHAR(4) ,
Ssex CHAR(2) ,
Sage SMALLINT ,
Sdept CHAR(2),
PRIMATY KEY(Sno)      //定义为表级完整性约束条件
);

多属性构成的码只有一种定义方式:
定义为表级约束条件

举个例子:将SC表中的 sno和cno定义为码

CREATE TABLE SC(
Sno CHAR(9)  ,
Cno SMALLINT ,
Grade SMALLINT ,
PRIMARY KEY(sno,cno)   //定义表级完整性
);```

2、 实体完整性检查和违约处理

插入或对主码列进行更新操作时,DBMS按照实体完整性自动进行检查,包括:
1、 检查主码值是否唯一,如果不唯一,那么就拒绝插入或者修改;
2、 检查主码的各个属性是否为空,如果为空,那么就拒绝插入或者修改;
检查主码是否唯一的操作 包括 全表扫描和索引两种方法;

二、参照完整性

实体完整性是对单张表格而言,对主属性进行完整性定义,而参照完整性就是相较于两张表而言的

1、定义参照完整性

CREATE TABLE 时用FOREIGN KEY定义哪些列为外码,用PEFERENCES指明这些外码参照哪些表的主码;

讲到这里有提到外码的定义 外码就是相对于该表而言,不是该表格码,但却是其他表的码;

举个例子: 定义SC表格中的参照完整性

CREATE TABLE SC(
Sno CHAR(9)  ,
Cno SMALLINT ,
Grade SMALLINT ,
PRIMARY KEY(sno,cno),
FOREIGN KEY (Sno) REFERENCES Student(Sno),
FOREIGN KEY (Cno) REFERENCES Course(Cno) 
);

2、参照完整性检查和违约条件

参照完整性,顾名思义就是“参照”,也就是说参照表(sc)表中的sno是参照被参照表(student表)的sno,所以sc表中的sno一定是在被参照表(student表)中存在的;
当你想插入或者修改一条选课记录时,sno必须是存在的;

举个例子:当你想要插入一个学号没在student表中存在的选课记录时

INSERT INTO sc VALUES('200215126',3,80)

结果:在这里插入图片描述

对于被参照表而言,当你要删除被参照表的元组或者修改主码值时,也会破坏参照完整性;
处理方式:

1.拒绝执行 (NO ACTION)–默认策略

CREATE TABLE SC(
Sno CHAR(9)  ,
Cno SMALLINT ,
Grade SMALLINT ,
PRIMARY KEY(sno,cno),
FOREIGN KEY (Sno) REFERENCES Student(Sno),     //默认就是 NO ACTION
FOREIGN KEY (Cno) REFERENCES Course(Cno) 
);
DELETE FROM student WHERE SNO='200215121';

结果:
在这里插入图片描述

UPDATE student SET sno='200215126'WHERE Sno='200215121';

结果:在这里插入图片描述

2、级联操作( ON DELETE CASCADE ON UPDATE CASCADE)

CREATE TABLE SC(
Sno CHAR(9)  ,
Cno SMALLINT ,
Grade SMALLINT ,
PRIMARY KEY(sno,cno),
FOREIGN KEY (Sno) REFERENCES Student(Sno) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (Cno) REFERENCES Course(Cno) 
);

修改被参照表 student 的码值 或者删除元组后,sc表会有一个级联操作,sc表相应的数据也会被删除;

3、设为空值 (SET NULL)
将被参照表(student)的值被删除后,参照表(sc)对应值被设为空值;
将被参照表(student)的值更新后,参照表(sc)对应值被设为空值;

总结:在这里插入图片描述

三、 属性上的约束条件

1、属性上的约束条件的定义

CREATE TABLE 时定义:

  • NOT NULL —列表值非空
  • UNIQUE —列表值唯一
  • CHECK — 检查列值是否满足一个表达式

2、属性上的约束条件的检查和违约处理

插入元组或者修改属性时,DBMS自动检查属性上的约束条件时候满足要求,如果不满足,操作就拒绝执行;

  • 列不允取空值
    举个例子: 学生表的名字,性别,年龄,系别 不能取空值
CREATE TABLE Student(
Sno CHAR(9),
Sname CHAR(4) NOT NULL,
Ssex CHAR(2) NOT NULL,
Sage SMALLINT NOT NULL,
Sdept CHAR(2) NOT NULL,
PRIMATY KEY(Sno)      //定义为表级完整性约束条件
);
  • 列取唯一值
    举个例子: 课程表的课程名称必须取唯一值;
CREATE TABLE Course(
Cno SMALLINT PRIMARY KEY ,
Cname VARCHAR(10) UNIQUE,  //取唯一值
Cpno SMALLINT,
Ccredit SMALLINT '
)COMMENT'课程表';
  • 用CHECK短语指定列值应该满足的条件;
    举个例子: 学生表的性别只能取男或女;
CREATE TABLE Student(
Sno CHAR(9) PRIMARY KEY 
Sname CHAR(4) ,
Ssex CHAR(2) CHECK(Ssex IN('男','女')) ,
Sage SMALLINT ,
Sdept CHAR(2)
);

四、完整性约束条件命名子句

1、完整性命名子句定义

CREATE TABLE 时可以对完整性约束条件进行命名,从而灵活的增加,删除一个完整性约束条件

CONSTRAINT<完整性约束条件名><完整性约束条件>
完整性约束条件包括:

  • NOT NULL
  • UNIQUE
  • CHECK
  • PRIMARY KEY
  • FOREIGN KEY

2、修改表中的完整性限制

举个例子: 将student表中的学号的范围改为111111111-999999999之间,将年龄有小于30岁改为小于40岁

ALTER TABLE student DROP CONSTRAINT C1;
ALTER TABLE student ADD CONSTRAINT C1 CHECK(Sno BETWEEN 11111111 AND 999999999);

ALTER TABLE student DROP CONSTRAINT C3;
ALTER TABLE student ADD CONSTRAINT C3 CHECK(Sage<40);

五、域

域就是相当于c++中数据类型,当然我们知道,类相当于一个自定义的数据类型 ,在sql中我们也可以自己定义一个域,从而定义了一个自定义的数据类型;
sql支持域的概念,并可以通过CREATE DOMAIN语句建立一个域及该域应该满足的完整性约束条件,当域上的完整性约束条件改变时只需要修改域的定义即可,而不必修改域上的各个属性;
举个例子:建立一个性别域,并声明性别域的取值范围。

CREATE DOMAIN SexDomain CHAR(2) CHECK(VALUE IN('男','女');

这样学生表里的Ssex可以写为

Ssex SexDomain;
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朋朋Elly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值