数据库系统基础教程(第7章)

上传人:简****9 文档编号:112612152 上传时间:2019-11-06 格式:PPT 页数:48 大小:159KB
返回 下载 相关 举报
数据库系统基础教程(第7章)_第1页
第1页 / 共48页
数据库系统基础教程(第7章)_第2页
第2页 / 共48页
数据库系统基础教程(第7章)_第3页
第3页 / 共48页
数据库系统基础教程(第7章)_第4页
第4页 / 共48页
数据库系统基础教程(第7章)_第5页
第5页 / 共48页
点击查看更多>>
资源描述

《数据库系统基础教程(第7章)》由会员分享,可在线阅读,更多相关《数据库系统基础教程(第7章)(48页珍藏版)》请在金锄头文库上搜索。

1、1,第7章 约束和触发器,2,SQL中约束种类,数据库设计质量体现为约束constraints所提供的可靠性保障。约束以表达式或语句的形式存储在数据库中。约束是一种主动性(active)元素,当数据库特定状态发生改变时自动运行。 SQL2提供部分完整性约束:键、参照完整性、域约束、元组约束等。 SQL3提供触发器trigger机制:由特定事件触发某种主动性元素。,3,7.1 键和外键,4,键与外键,键key是最重要的约束。每个表都必须确定自己的键。 每个表都可能有多个属性集可作为键,称为“候选键candicate key”。 一个表只能确定一个主键(Primary Key)。 若某个属性说明为

2、Unique,则它是一个候选键。 若关系的某个属性说明为外键,则该属性出现的值,一定会在另一个关系的主键中出现。,5,主键声明,如何说明表中的主键? SQL语言有两种说明主键的方式。 方式1:Create Table语句中,某属性说明之后加Primary Key 方式2:属性表之后,加Primary Key(属性1,属性2,) 若主键有多个属性,则只能用方式2。 GUI操作方式更方便直观。,6,用UNIQUE声明键,如何说明表中的主键? SQL语言有两种说明主键的方式。 方式1:Create Table语句中,某属性说明之后加UNIQUE 方式2:属性表之后,加UNIQUE(属性1,属性2,)

3、 若用UNIQUE说明键有多个属性,则只能用方式2。 GUI操作方式更方便直观,7,例子,考虑关系SalesMan的模式(方式1) CREATE TABLE SalesMan( empid VARCHAR (10) PRIMARY KEY, idno VARCHAR (18) UNIQUE, name VARCHAR (30), gender CHAR(1), birthday DATE, address VARCHAR(255), phone VARCHAR(13) );,8,例子,考虑关系SalesMan的模式(方式2) CREATE TABLE SalesMan( empid VARCH

4、AR (10), idno VARCHAR (18), name VARCHAR (30), gender CHAR(1), birthday DATE, address VARCHAR(255), phone VARCHAR(13), PRIMARY KEY(empid), UNIQUE(idno) );,9,主键和Unique属性之间有何区别和联系,一个表有且仅有一个主键;而Unique属性可有多个或没有。 主键是单个属性,则该属性隐含为Unique。 主键不允许有NULL值,属性为Unique则允许有NULL值。 若主键是多个属性,则每个属性都不可能为Unique。 DBMS对主键往往自

5、动赋予一些特征,如建立索引index等。,10,强制键约束,什么操作会导致违背键约束? 对表的delete操作不会违背该表的键约束。 insert和update可能违背该表的键约束。 SQL实施主键约束即是在insert和update时检验键值,避免空值或重复键值。,11,外键约束声明,如何说明外键 两种SQL方式: 方式1:某属性之后加references (被参照属性)。 方式2:属性表之后加foreign key references (被参照属性)。 其中:被参照属性应是被参照表的Primary Key或unique属性。,12,例子,例: CREATE TABLE StarsIn(

6、Movietitle VARCHAR(90) NOT NULL, Movieyear INT NOT NULL , StarName VARCHAR(30) NOT NULL, PRIMARY KEY (Movietitle, Movieyear, StarName), FOREIGN KEY (Movietitle, Movieyear) References Movie(title, year), FOREIGN KEY StarName References Stars(name) );,13,外键约束声明,是否可定义一个表参照自己? 可以。 例如:salesman(empid, idn

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

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

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

10、,18,维护引用完整性策略的语法,这些策略可在说明外键的同时描述。 references (属性表)Action 其中: Action: ON Update | Delete Restrict | Cascade | Set Null ,19,例子,CREATE TABLE Movie( title VARCHAR(90) NOT NULL, year INT NOT NULL, length INT, colorIn CHAR(1) NOT NULL, producerC# INT, PRIMARY KEY (title,year), FOREIGN KEY producerC# Refer

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

12、使其不参照任何元组。,21,7.2 属性和元组上的约束,22,属性值约束,限制某些属性的值在特定范围内. 这类约束可用下列方式表达: 在关系式定义中给出属性的约束。 在整个元组上的约束。该约束是关系模式的一部分,不与任何属性相关。,23,非空约束,如何说明某属性非空NOT NULL? 在create table指令中,属性说明之后加NOT NULL; 若不显式说明,该属性隐含为允许空值。 说明非空属性有何效果? 不能用update修改其值为NULL。 insert时必须指定一个非空值。 不能使用外键的Set Null策略。 注意:主键属性和unique属性隐含非空;允许为空的属性不可能是主键或

13、unique。,24,基于属性的Check约束,如何限制某属性的值在特定范围? 在属性说明之后,增加check(条件),属性的值应使条件为真。 条件的语法与Where子句的条件一样。 当insert和update使属性值改变时,执行check检验,拒绝预约属性不一致的更新。,25,例子,设有关系模式: Stodio(name,address,presC#) 要求其证书号必须至少为位数字,则可写出约束: presC# INT REFERENCES MovieExec(cert#) CHECK(presC#=100000) 设有关系模式: MovieStar(name,address,gender

14、,birthday) 要求其性别只能为和,则可写出约束: gender CHAR(1) CHECK(gender IN (,),26,基于属性的Check约束,何时检查check条件? 只有当该表执行insert或update时才检测check条件。 注意:check条件中可包含其它关系的属性,但应避免。 例如,设有关系 Stodio(name,address,presC#) 其关系中presC#值必须在关系 MovieExec(name,address,cert#,networth) 的cert#之中出现约束,则在定义中给出约束: presC# INT CHECK(presC# IN(SEL

15、ECT cert# FROM MovieExec) 修改或删除cert#的值,使某个presC#对应的键值不在MovieExec中是可能的。,27,域约束,域domain 也称为用户定义数据类型user-defined data type. 基于某种基本数据类型且增加特定约束,存于数据库中,可供多个表使用。 例如: CREATE DOMAIN “sex“ integer NOT NULL DEFAULT 1 CHECK(VALUE IN(0,1) ),28,基于元组的Check约束,对某个表中元组的约束而不是对某个属性的约束。 例如:在关系模式 MovieStar(name,address,g

16、ender,birthday) 中要求每个元组的审核:如果影星为男性,则他的名字不能与Ms.开头。 在定义表的性质时增加如下约束: CHECK(gender= F OR name NOT LIKE Ms.%) 何时检查check条件? 只有当该表执行insert或update时才检测check条件。 注意:如果在表中既有属性check也有元组check,则先检测属性。,29,7.3 修改约束,30,给约束命名,为修改或删除一个已经存在的约束,约束必须有名字。为了命名,在约束前加保留字CONSTRAINT和该约束的名字。 例如:设有关系模式 MovieStar(name,address,gender,birthday) 为其主键约束命名: name CHAR(30) CONSTRAINT NameIsKey PRIMARY KEY 为影星的性别约束命名: gender CHAR(1) CONSTRAINT NoAndro CHECK(gender IN (,),31

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

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