数据库系统原理-第七章约束与触发器剖析

上传人:今*** 文档编号:107639380 上传时间:2019-10-20 格式:PPT 页数:67 大小:894.50KB
返回 下载 相关 举报
数据库系统原理-第七章约束与触发器剖析_第1页
第1页 / 共67页
数据库系统原理-第七章约束与触发器剖析_第2页
第2页 / 共67页
数据库系统原理-第七章约束与触发器剖析_第3页
第3页 / 共67页
数据库系统原理-第七章约束与触发器剖析_第4页
第4页 / 共67页
数据库系统原理-第七章约束与触发器剖析_第5页
第5页 / 共67页
点击查看更多>>
资源描述

《数据库系统原理-第七章约束与触发器剖析》由会员分享,可在线阅读,更多相关《数据库系统原理-第七章约束与触发器剖析(67页珍藏版)》请在金锄头文库上搜索。

1、第7章 约束与触发器,7.1 键与外键 7.2 属性和元组上的约束 7.3 修改约束 7.4 断言 7.5 触发器,Page 1,SQL中约束种类,数据库设计质量体现为约束constraints所提供的可靠性保障。约束以表达式或语句的形式存储在数据库中。约束是一种主动性(active)元素,当数据库特定状态发生改变时自动运行。 SQL2提供部分完整性约束:键、参照完整性、域约束、元组约束等。 SQL3提供触发器trigger机制:由特定事件触发某种主动性元素。,Page 2,在第二章中已经介绍了SQL中通过保留字PRIMARY KEY或UNIQUE来定义一个属性或一组属性为关系的键。如:,CR

2、EATE TABLE Movies ( title char(20), year int, length int, genre char(10), studioName char (30), producerC int, PRIMARY KEY (title, year ) );,7.1 键与外键,Page 3,键key是最重要的约束。每个表都必须确定自己的键。 每个表都可能有多个属性集可作为键,称为“候选键candidate key”。 一个表只能确定一个主键(Primary Key)。 若某个属性说明为Unique,则它是一个候选键。 若关系的某个属性说明为外键,则该属性出现的值,一定会在

3、另一个关系的主键中出现。,7.1 键与外键,Page 4,7.1 键与外键,外键约束声明隐含两层意思: 被引用的另一个关系的属性必须是主键 外键属性取值必须属于被引用的另一个关系的主键属性的值。,Page 5,举例,学籍管理数据库,Page 6,声明外键的方法,和声明主键的方法一样,声明外键的方法也有两种。 如果外键是单个属性,则可以在此属性的名字和类型之后,声明其引用某个表的某个属性。格式如下: REFERENCES (),Page 7,举例,电影数据库模式如下:,Movies(title,year,length,genre,studioName,producerC) 名称 年份 长度(分钟

4、) 流派 电影公司名称 导演证书号,MovieStar(name, address, gender, birthdate) 姓名 住址 性别 生日,StarsIn(movieTitle, movieYear, starName) 影片名称 年份 主演姓名,MovieExec(name, address, cert, netWorth) 导演姓名 住址 导演证书号 净资产,Studio(name, address, presC) 电影公司名称 地址 经理证书号,要声明StarsIn表中的starName属性对MovieStar表的 name属性的引用完整性约束,声明方法如下:,Page 8,举例

5、,CREATE TABLE StarsIn ( movieTitle char(20), movieYear int, starName char(12) REFERENCES MovieStar(name), PRIMARY KEY (movieTitle , movieYear , starName ) );,Page 9,举例,CREATE TABLE StarsIn ( movieTitle char(20), movieYear int, starName char(12) REFERENCES MovieStar(name), PRIMARY KEY (movieTitle , m

6、ovieYear , starName ) ); 如果在StarsIn表中插入周星驰参演少林足球信息(周星驰未在MovieStar中出现),能否插入? INSERT INTO StarsIn VALUES(少林足球,2001,周星驰);,不能,因为违反了在starName属性上定义的引用完整性约束。,Page 10,举例,CREATE TABLE StarsIn ( movieTitle char(20), movieYear int, starName char(12) REFERENCES MovieStar(name), PRIMARY KEY (movieTitle , movieYe

7、ar , starName ) ); 如果在StarsIn表中插入徐帆参演唐山大地震的信息(徐帆在MovieStar)中出现,能否插入? INSERT INTO StarsIn VALUES(唐山大地震,2001,徐帆);,能,因为不违反在starName属性上定义的引用完整性约束。,Page 11,声明外键的方法,和声明主键的方法一样,声明外键的方法也有两种。 如果外键是由两个属性以上的属性组成,则要在CREATE TABLE语句中专门追加一个声明,格式如下: FOREIGN KEY () REFERENCES (),Page 12,举例,电影数据库模式如下:,Movies(title,ye

8、ar,length,genre,studioName,producerC) 名称 年份 长度(分钟) 流派 电影公司名称 导演证书号,MovieStar(name, address, gender, birthdate) 姓名 住址 性别 生日,StarsIn(movieTitle, movieYear, starName) 影片名称 年份 主演姓名,MovieExec(name, address, cert, netWorth) 导演姓名 住址 导演证书号 净资产,Studio(name, address, presC) 电影公司名称 地址 经理证书号,要声明StarsIn表中的movieT

9、itle , movieYear属性对 Movies表的title,year属性的引用完整性约束。,Page 13,举例,CREATE TABLE StarsIn ( movieTitle char(20), movieYear int, starName char(12) REFERENCES MovieStar(name), PRIMARY KEY (movieTitle , movieYear , starName ), FOREIGN KEY (movieTitle, movieYear) REFERENCES Movies(title, year) );,声明StarsIn表中的mo

10、vieTitle , movieYear属性对 Movies表的title , year属性的引用完整性约束的 方法如下:,Page 14,举例,此时,如果在StarsIn表中插入徐帆参演唐山大地震的信息(未出现在Movies中),能否插入,为什么? INSERT INTO StarsIn VALUES(唐山大地震,2001,徐帆);,不能,虽然不违反在starName属性上定义的引用完整性约束。但是违反了在movieTitle和 movieYear属性上定义的引用完整性约束。,Page 15,外键约束声明,是否可定义一个表参照自己? 可以。 例如:salesman(empid, idno,

11、name, managerid, deptid, ) 外键是否可取NULL值? 可以。,Page 16,维护引用完整性,数据库更新时如何保证参照完整性? 有三种可选策略,以保证参照完整性: 1 Restrict限制(缺省) 2 Cascade级联 3 Set Null置空,Page 17,Restrict限制(缺省),以StarsIn(movieTitle,MovieYear, )参照Movie(title,year, ) 为例: 对于StarsIn (参照表),下面操作被拒绝: insert语句中movieTitle和MovieYear值不是Movie中已有的一个主键值。 update语句中

12、改变movieTitle和MovieYear值为不是Movie中已有的主键值。 对于Movie(被参照表),Restrict拒绝以下操作: delete语句删除一个被StarsIn参照的元组。 update语句修改一个被StarsIn参照的title和year主键值。,Page 18,Cascade级联,影响被参照表的delete和update操作。 以StarsIn(movieTitle,MovieYear, )参照Movie(title,year, ) 为例: 当Movie (被参照表)delete删除某个元组时,StarsIn (参照表)中所有参照元组被自动删除。 当Movie (被参照

13、表)update修改某个元组的title或year值时,StarsIn (参照表)中所有参照元组被自动修改。,Page 19,Set Null置空,影响被参照表的delete和update操作。 以Movie(title,year, , ProducerC#)参照MovieExec(name, ,cert#, )为例: 首先ProducerC#应允许NULL。 当MovieExec (被参照表)delete删除某个元组时,Movie (参照表)中所有参照元组的ProducerC#被置空。 当MovieExec (被参照表)update修改某个元组的cert#时,Movie (参照表)中所有参照

14、元组的ProducerC#被置空。,Page 20,维护引用完整性策略的语法,这些策略可在说明外键的同时描述。 references (属性表)Action 其中: Action: ON Update | Delete Restrict | Cascade | Set Null ,Page 21,例子,CREATE TABLE Studio( name VARCHAR(30) NOT NULL, address VARCHAR(255), presC# INT, PRIMARY KEY (Name), FOREIGN KEY (presC#) References MovieExec(cert

15、#) ON DELETE SET NULL ON UPDATE CASCADE); 注意:对于一个外键,Update和Delete可分别采用不同的策略。,Page 22,“悬挂元组” dangling tuples,什么是“悬挂元组” dangling tuples? 对于参照关系A,外键值未出现在被参照表中的元组,即违背参照完整性的元组。 如何避免出现“悬挂元组”? 1 Restrict策略:在参照关系中对产生悬挂元组的操作予以禁止。 2 Cascade策略:自动删除或修改产生出来的悬挂元组。 3 Set Null策略:产生出来的每个悬挂元组的外键值置空NULL,使其不参照任何元组。,Pag

16、e 23,延迟约束检查,假设施瓦辛格卸任加州州长后,建立一个电影公司,公司名称为La Vista,他作为公司的经理,则 Insert into Studio Values( La Vista , New York , 23456) 则数据插入有一些麻烦,原因是假设23456是最新颁发的证书。 Insert into Studio(name, address) Values( La Vista , New York ) 将证书号插入MovieExec关系后,修改 Update Studio SET presC#=23456 Where name= La Vista ,Page 24,延迟约束检查,当如果发生循环约束(circular const

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号