数据库原理(十 六)- 数据库完整性

前言

数据库的完整性是指数据的正确性和相容性。数据的正确性是指数据是符合现实世界语义、反映当前实际状况的;数据的相容性是指数据库同一对象在不同关系表的数据是符合逻辑的
数据的完整性和安全性是两个既有联系又不尽相同的概念。数据的完整性是为了防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据;数据的安全性是保护数据库防止恶意破坏和非法获取

数据库完整性功能要求

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

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

关系数据库管理系统使得完整性控制成为其核心支持的功能,从而能够为所有用户和应用提供一致的数据库管理完整性

实体完整性

实体完整性的定义

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

  1. 对单属性构成的码有两种说明方法,一种是定义列级约束条件,另一种是定义为表级约束条件
  2. 对多个属性构成的码只有一种说明方法,即定义表级约束条件

列级约束条件

create table student(
   sno char(10) primary key,
   ......

)

表级约束条件

create table student(
   sno char(10) ,
   ......
   primary key(sno)
)

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

  1. 检查主码值是否唯一,如果不唯一则拒绝插入或修改
  2. 检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改

参照完整性

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

create table sc(
sno char(10) primary key,
cno char(10),
foreign key sno references student(sno) 
)

可被参照的对象:

  • 被参照表中的属性
  • 参照表中自已的属性

参照完整性检查

  • 参照属性的值必须与被参照表中属性的值相同

违约处理

  • 拒绝执行
  • 级联操作
  • 设置为空值

用户定义的完整性

属性上的约束条件

  • 属性上约束条件的定义,主要包括:
    • 列值非空(NOT NULL)
    • 列值唯一(UNIQUE)
    • 检查列值是否满足一个条件表达式(CHECK短语)
  • 属性上约束条件的检查和违约处理
    • 如果不满足条件,就拒绝执行

元组上的约束条件

  • 元组上约束条件的定义,仅使用CHECK约束短语一项,是在表级约束上的
  • 元组上约束条件的检查和违约处理
    • 如果不满足条件,就拒绝执行

示例

CREATE TABLE student(
Sno char(10) primary key,
Sname char(10) unique not null,
Ssex char(2),
check(Ssex='女' or Sname NOT LIKE('Ms.%')
)

完整性约束命名子句

上面的完整性约束条件都在CREATE TABLE语句中定义,SQL还在CREATE TABLE语句中提供了完整性约束命名子句CONSTRAINT,用来对完整性约束条件命名,从而可以灵活地增加、删除一个完整性约束条件

完整性约束命名子句

CONSTRAINT <完整性约束条件名><完整性约束条件>

完整性约束条件包括NOT NULL、UNIQUE、 PRIMARY KEY、 FOREIGN KEY、 CHECK短语等

修改表中的完整性限制

alter table <表名>
 drop  constraint <完整性约束名> //删除完整性约束
 add CONSTRAINT <完整性约束条件名> <完整性约束条件> //添加完整性约束

断言

在涉及多表或聚集操作的比较复杂的完整性约束时使用

  • 创建断言的语句格式
CREATE ASSERTION <断言名> <CHECK 子句>
  • 删除断言的语句格式
DROP ASSERTION <断言名>

触发器

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

定义触发器

CREATE TRIGGER <触发器名>
{BEFORE|AFIER} <触发事件> ON <表名>  //触发事件前/触发事件后,触发事件包括select、 delete、update和insert,可以单个也可以组合
REFERENCING|OLD ROW AS<变量>
FOR EACH{ROW|STATEMENT} //列级触发器|语句级触发器
[WHEN <触发条件>]<触发动作体>

激活触发器

触发器的执行是由触发事件激活,并由数据库服务器自动执行的。如果一个表上有多个触发器,激活触发器的顺序是

  • 执行该表上的BEFORE触发器
  • 激活触发器的SQL语句
  • 执行该表上的AFTER 触发器

删除触发器

DROP TRIGGER <触发器名> ON <表名>

借鉴

王珊,萨师煊.数据库系统概论(第五版)[M].北京:高等教育出版社,2014:157-172.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章