数据库完整性

目录

一、实体完整性

二、参照完整性

三、用户自定义完整性

四、完整性约束命名子句

五、域中完整性限制

六、断言

七、触发器

触发器定义


数据库的完整性是指数据的正确性和相容性

完整性:是指数据是符合现实世界语义,反映当前实际状况的。

相容性:是指数据库同一对象在不同关系表中的数据是符合逻辑的。

为维护数据库的完整性,数据库管理系统必须能够实现如下功能:

  1. 提供定义完整性约束条件的机制。
  2. 提供完整性检查的方式。
  3. 进行违约处理。

关系数据库管理系统产品都支持完整性控制,即完整性定义和检查控制由关系数据库管理系统实现,不必由应用程序来完成,从而减轻了应用程序员的负担。更重要的是,关系数据库管理系统使得完整性控制成为其核心支持的功能,从而能够为所有用户和应用提供一致的数据库完整性。因为由应用程序来实现完整性控制是有漏洞的,有的应用程序定义的完整性约束条件可能被其他应用程序破坏,数据库数据的正确性仍然无法保障。

一、实体完整性

1.1 定义实体完整性

关系模型的实体完整性在CREATE TABLE 中用 PRIMATY KEY 定义。对单属性构成的码有两种说明方法,一种是定义为列级约束条件,另一种是定义为表级约束条件。对多个属性构成的码只有一种说明方法,即定义为表级约束条件。

[例5.1] 将 Student表中的 Sno 属性定义为码。

CREATE TABLE Student

(Sno CHAR(9) PRIMARY KEY, /*在列级定义主码*/

Sname CHAR(20) NOT NULL,

Ssex CHAR(2),

Sage SMALLINT,

Sdept CHAR(20)

);

或者

CREATE TABLE Student

(Sno CHAR(9),

Sname CHAR(20) NOT NULL,

Ssex CHAR(2),

Sage SMALLINT,

Sdept CHAR(20),

PRIMARY KEY (Sno) /*在表级定义主码*/

B+树索引:http://t.csdnimg.cn/9xQl4icon-default.png?t=N7T8http://t.csdnimg.cn/9xQl4

二、参照完整性

关系模式的参照完整性在CEREATE TABLE中用FOREIGN KEY短语定义哪些列为外码,用REFERNCES 短语指明这些外码参照哪些表的主码

例如:关系SC中一个元组表示一个学生选修的某门课程的成绩,(Sno, Cno)是主码 ,Sno, Cno分别参照引用Student表的主码和Course表的主码。

[例5.3]定义sc中的参照完整性。

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 UNLL)。
  • 列值唯一(UNIQUE)。
  • 检查列值是否一个条件表达式(CHECK短语)。
1.性别属性Sex只允许取‘男’或‘女’
check(Sex IN ('男','女'))

2.Grade取值范围是0-100.
check(Grade>=0 and Grade<=100)

3.定义了元组Sname 和 Sex 两个属性值的约束条件
check(Sex='女' or Sname not like 'Ms.%')

四、完整性约束命名子句

完整性约束命名子句:CONSTRAINT<完整性约束条件名><完整性约束条件>

<完整性约束条件>包括:not null,unique,primary key,foreign key,check...

CONSTRAINT C1 check (Sno between 90000 and 99999)

CONSTRAINT C2 not null

CONSTRAINT C3 check (Sage<30)

CONSTRAINT C4 check(Sex in('男','女'))

CONSTRAINT C5 StudentKey primary key(Sno)

alter table Student
drop constraint c1   删除

alter table Student
add constraint c1 check(Sno between 9000 and 9999) 增加

五、域中完整性限制

域是一组有相同数据类型的值的集合。SQL支持域的概念,并可以用create domain 语句建立一个域以及域应该满足的完整性约束条件,然后就可以用域来定义属性。

优点:数据库中不同的属性可以来自同一个域,当域上的完整性约束条件改变时只要修改域的定义即可,而不必一一修改域上的各个属性。

1.建立一个域,声明域的取值范围。

create domain GenderDomain char(2)
check (value in '男' ,'女');


2.建立一个性别域GenderDomain,并对其中的限制命名。

CREATE DOMAIN GenderDomain CHAR(2)
CONSTRAINT GD CHECK ( VALUE IN(男',女));


3.删除 域GenderDomain的限制条件GD.

ALTER DOMAIN GenderDomain
DROP CONSTRAINT GD;


4.在域GenderDomain上增加性别的限制条件GDD.

ALTER DOMAIN GenderDomain
ADD CONSTRAINT GDD CHECK (VALUE in ('1','0'));

这样,通过例3和例4,就把性别的取值范围由(男,女成为 ('1','0').

六、断言

创建断言:create assertion <断言名><check 子句>       

删除断言:drop assertion<断言名>

注意:断言很复杂,则系统在检测和维护断言上的开销较高。

七、触发器

触发器:是用户定义在关系表上的一类由事件驱动的特殊过程。

触发器又叫做事件——条件——动作规则。

触发器定义

SQL 使用CREATE TRIGGER 命令建立触发器, 其一般格式为

CREATE TRIGGER<触发器名> /*每当触发事件发生时,该触发器被激活*/

{BEFORE|AFTER}<触发事件> ON<表名>

/*指明触发器激活的时间是在执行触发事件前或后*/

REFERENCING NEW|OLD ROW AS<变量> /*REFERENCING 指出引用的变量*/

FOR EACH {ROW|STATEMENT} /*定义触发器的类型,指明动作体执行的频率*/

[WHEN<触发条件>] <触发动作体> /*仅当触发条件为真时才执行触发动作体*/

定义触发器的语法说明:

1.创建者:表的拥有者才可以在表上创建触发器。

2.触发器名:

  • 触发器名可以包含模式名,也可以不包含模式名。
  • 同一模式下,触发器名必须是唯一的。
  • 触发器名和表名必须在同一模式下

3.表名:

  • 触发器只能定义在基本表上,不能定义在视图上。
  • 当基本表的数据发生变化时,将激活定义在该表上相应触发事件的触发器。

4.触发事件:

(1) INSERT、DELETE或UPDATE也可以是这几个事件的组合。

(2) UPDATE OF<触发列,..>,即进一步指明修改哪些列时激活触发器。

(3) AFTER/BEFORE是触发的时机。AFTER表示在触发事件的操作执行之后激活触发器。BEFORE表示在触发事件的操作执行之前激活触发器。

5.触发器类型:

行级触发器和语句级触发器

6.触发条件:

如果省略WHEN触发条件,则触发动作体在触发器激活后立即执行。

7.触发动作体

[例1]当对表SC的Grade 属性进行修改时,若分数增加了10%,则将此次操作记录到另一个表SC_U(Sno、Cno、Oldgrade、Newgrade)中,其中Oldgrade 是修改前的分数,Newgrade 是修改后的分数。

CREATE TRIGGER SC_T          /*SC_T是触发器的名字*/

AFTER UPDATE OF Grade ON SC       /*UPDATE OF Grade ON SC 是触发事件,*/
/* AFTER是触发的时机,表示当对SC 的Grade 属性修改完后再触发下面的规则*/

REFERENCING

    OLDROW AS OldTuple,

    NEWROWAS NewTuple

FOR EACH ROW     /*行级触发器,即每执行一次Grade的更新,下面的规则就执行一次*/

WHEN(NewTuple.Grade >= 1.1 * OldTuple.Grade) /*触发条件,只有该条件为真时才执行*/

    INSERT INTO SC_U (Sno,Cno,OldGrade,NewGrade) /*下面的INSERT 操作*/

    VALUES(OldTuple.Sno,OldTuple.Cno,OldTuple.Grade,NewTuple.Grade)

 8.删除触发器

drop trigger <触发器名>on <表名>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值