1、普通高等教育十五规划教材普通高等教育十五规划教材数据库系统概论数据库系统概论 第第5章章 数据库完整性数据库完整性张中军张中军2023年4月29日星期六数据库系统原理3第第5章章 完整性完整性 n数据库是一种共享资源,是存放数据的场所。数据库是一种共享资源,是存放数据的场所。n数据库系统需要保护数据库,防止用户数据库系统需要保护数据库,防止用户有意有意或或无意无意地破坏地破坏数据。数据。n数据的完整性和安全性是一个问题的两个方面,都是为了数据的完整性和安全性是一个问题的两个方面,都是为了保护数据库中的数据。保护数据库中的数据。n数据完整性数据完整性旨在保护数据库中的数据,旨在保护数据库中的数据
2、,防止合法用户对防止合法用户对数据库进行修改时破坏数据的一致性;数据库进行修改时破坏数据的一致性;n数据安全性数据安全性旨在保护数据库,防止未经授权的访问和恶旨在保护数据库,防止未经授权的访问和恶意破坏和修改。意破坏和修改。2023年4月29日星期六数据库系统原理4第第5章章 完整性完整性 n完整性概述完整性概述n5.1 实体完整性实体完整性n5.2 参照完整性参照完整性n5.3 用户定义的完整性用户定义的完整性n5.4 完整性约束命名字句完整性约束命名字句n5.5 触发器触发器完整性概述完整性概述2023年4月29日星期六数据库系统原理6完整性概述完整性概述n数据库的数据库的完整性完整性是指
3、数据库中的数据的正确性、一致性和是指数据库中的数据的正确性、一致性和相容性。相容性。n数据库中的数据要成为有意义的信息,必须满足一定的语数据库中的数据要成为有意义的信息,必须满足一定的语义约束条件。义约束条件。n关系数据库上约束分为关系数据库上约束分为n实体完整性实体完整性n参照完整性参照完整性n用户定义的完整性用户定义的完整性2023年4月29日星期六数据库系统原理7完整性概述完整性概述n所有的约束都是语义约束,所有的约束都是语义约束,都是用户根据实际问题的语义都是用户根据实际问题的语义指定的指定的n实体完整性和参照完整性约束的含义是特定的,用户只实体完整性和参照完整性约束的含义是特定的,用
4、户只需要说明关系的主码和外码,而不必再说明约束条件需要说明关系的主码和外码,而不必再说明约束条件n对于其他约束(用户定义的完整性),用户需要具体说对于其他约束(用户定义的完整性),用户需要具体说明约束条件。明约束条件。2023年4月29日星期六数据库系统原理8约束分类约束分类n根据被约束的数据对象,完整性约束可以分为如下四类:根据被约束的数据对象,完整性约束可以分为如下四类:n类型(域)约束类型(域)约束:说明给定类型的合法取值。:说明给定类型的合法取值。n属性约束属性约束:说明属性的合法取值。:说明属性的合法取值。n关系约束关系约束:说明关系的合法取值。:说明关系的合法取值。n数据库约束数据
5、库约束:说明数据库的合法取值,通常涉及多个关:说明数据库的合法取值,通常涉及多个关系系n实体完整性是一种关系约束,参照完整性是一种数据库约实体完整性是一种关系约束,参照完整性是一种数据库约束,而用户定义的完整性可以是上述四种约束的任何一种。束,而用户定义的完整性可以是上述四种约束的任何一种。2023年4月29日星期六数据库系统原理9约束分类约束分类(续续)n约束还可以分约束还可以分静态约束静态约束和和动态约束动态约束n静态约束是关于数据库正确状态的约束;静态约束是关于数据库正确状态的约束;n动态约束是数据库从一种正确状态转移到另一种状态的动态约束是数据库从一种正确状态转移到另一种状态的转移约束
6、转移约束n例如,对于婚姻状况,如下动态转移约束是正确的例如,对于婚姻状况,如下动态转移约束是正确的n未婚到已婚、已婚到离异、已婚到丧偶、离异到已婚、未婚到已婚、已婚到离异、已婚到丧偶、离异到已婚、丧偶到已婚。丧偶到已婚。n对于最后学位,如下动态转移约束是正确的:学士到硕对于最后学位,如下动态转移约束是正确的:学士到硕士、学士到博士、硕士到博士。士、学士到博士、硕士到博士。n说明:说明:n属性约束、表约束和参照完整性约束都可以在创建表时属性约束、表约束和参照完整性约束都可以在创建表时说明说明2023年4月29日星期六数据库系统原理10DBMS对完整性的支持对完整性的支持n为了维护数据库的完整性,
7、完整性控制必须提供:为了维护数据库的完整性,完整性控制必须提供:n说明和定义完整性约束条件的方法说明和定义完整性约束条件的方法nDBMS的的DDL允许用户根据实际问题的语义说明和定允许用户根据实际问题的语义说明和定义各种完整性约束条件。义各种完整性约束条件。n完整性检查机制完整性检查机制nDBMS在数据更新可能破坏完整性时自动进行完整性在数据更新可能破坏完整性时自动进行完整性检查。检查可以在更新操作执行时立即执行,也可以检查。检查可以在更新操作执行时立即执行,也可以在事务提交时进行。在事务提交时进行。n违约处理违约处理n当数据更新违反完整性约束时,当数据更新违反完整性约束时,DBMS应当采取相
8、应应当采取相应的措施,确保数据的完整性。的措施,确保数据的完整性。2023年4月29日星期六数据库系统原理11DBMS对完整性的支持对完整性的支持(续续)n说明说明n数据库约束数据库约束的检查是可延迟的,可以延迟到事务提交时的检查是可延迟的,可以延迟到事务提交时进行进行n其他约束的检查是立即的,在可能导致违反完整性约束其他约束的检查是立即的,在可能导致违反完整性约束的更新时立即进行的更新时立即进行n所有数据库更新都不能破坏数据库的完整性所有数据库更新都不能破坏数据库的完整性n当更新违反参照完整性约束时存在多种可能的补救措施,当更新违反参照完整性约束时存在多种可能的补救措施,可以允许更新,并自动
9、采取相应的行动(见可以允许更新,并自动采取相应的行动(见5.2节)节)n在其他情况下(如违反实体完整性和违反用户定义的完在其他情况下(如违反实体完整性和违反用户定义的完整性约束),违反完整性约束的更新通常被拒绝整性约束),违反完整性约束的更新通常被拒绝nDBMS也提供一些机制,使得也提供一些机制,使得用户可以说明对某些违反用户可以说明对某些违反完整性约束的更新所采取的行动完整性约束的更新所采取的行动(见(见5.5节)节)5.1实体完整性实体完整性2023年4月29日星期六数据库系统原理13实体完整性实体完整性n在关系数据库中,一个基本关系对应于一个实体集或联系在关系数据库中,一个基本关系对应于
10、一个实体集或联系集集n实体完整性约束是一个关系内的约束实体完整性约束是一个关系内的约束n实体完整性规则实体完整性规则n每个关系应该有一个主码,每个元组的主码值唯一确定每个关系应该有一个主码,每个元组的主码值唯一确定该元组该元组n主码的任何属性都不能取空值主码的任何属性都不能取空值n何时可能破坏实体完整性何时可能破坏实体完整性n删除操作不会破坏实体完整性删除操作不会破坏实体完整性n插入新元组和修改某个(些)元组的主码可能破坏实体插入新元组和修改某个(些)元组的主码可能破坏实体完整性完整性2023年4月29日星期六数据库系统原理14实体完整性实体完整性(续续)n何时检查实体完整性和处理措施何时检查
11、实体完整性和处理措施nDBMS应当在应当在插入新元组和修改元组的主码插入新元组和修改元组的主码时自动检查时自动检查是否导致违反实体完整性约束是否导致违反实体完整性约束n拒绝导致破坏实体完整性约束的任何插入或修改拒绝导致破坏实体完整性约束的任何插入或修改n判断主属性是否为空值是简单的判断主属性是否为空值是简单的n主码唯一性检查主码唯一性检查n为了有效地判定主码上的值是否唯一,通常为了有效地判定主码上的值是否唯一,通常DBMS自动自动在主码上建立索引(如在主码上建立索引(如B+树索引)树索引)n通过索引查找而不必访问任何元组就能确定主码上的值通过索引查找而不必访问任何元组就能确定主码上的值是否唯一
12、。是否唯一。2023年4月29日星期六数据库系统原理15主码说明主码说明n SQL对实体完整性的支持对实体完整性的支持n用户只需要在创建基本表时用户只需要在创建基本表时说明关系的主码说明关系的主码,系统就,系统就能够自动地保证实体完整性能够自动地保证实体完整性nSQL说明主码的方法已在第说明主码的方法已在第3章讨论,如下:章讨论,如下:n关系模型的实体完整性关系模型的实体完整性nCREATE TABLE中用中用PRIMARY KEY定义定义2023年4月29日星期六数据库系统原理16主码说明(续)主码说明(续)n单属性构成的码有两种说明方法单属性构成的码有两种说明方法 n定义为列级约束条件定义
13、为列级约束条件n定义为表级约束条件定义为表级约束条件n对多个属性构成的码只有一种说明方法对多个属性构成的码只有一种说明方法n定义为表级约束条件定义为表级约束条件 2023年4月29日星期六数据库系统原理17主码说明(续)主码说明(续)(1)在列级定义主码在列级定义主码 CREATE TABLE Student (Sno CHAR(9)PRIMARY KEY,Sname CHAR(20)NOT NULL,Ssex CHAR(2),Sage SMALLINT,Sdept CHAR(20);例例1 将将Student表中的表中的Sno属性定义为码属性定义为码2023年4月29日星期六数据库系统原理1
14、8主码说明(续)主码说明(续)(2)在表级定义主码在表级定义主码 CREATE TABLE Student (Sno CHAR(9),Sname CHAR(20)NOT NULL,Ssex CHAR(2),Sage SMALLINT,Sdept CHAR(20),PRIMARY KEY(Sno);2023年4月29日星期六数据库系统原理19主码说明(续)主码说明(续)CREATE TABLE SC (Sno CHAR(9)NOT NULL,Cno CHAR(4)NOT NULL,Grade SMALLINT,PRIMARY KEY(Sno,Cno)/*只能在表级定义主码只能在表级定义主码*/)
15、;例例2将将SC表中的表中的Sno,Cno属性组定义为码属性组定义为码5.2参照完整性参照完整性2023年4月29日星期六数据库系统原理21参照完整性参照完整性n参照完整性约束是不同关系之间或同一关系的不同元组间参照完整性约束是不同关系之间或同一关系的不同元组间的约束的约束n参照完整性规则参照完整性规则n参照关系参照关系R的任何元组在其外码的任何元组在其外码FKR上的值或者等于被参上的值或者等于被参照关系照关系S的某个元组在主码的某个元组在主码Ks上的值,或者为空值。上的值,或者为空值。n即,参照完整性要求要么不参照(外码取空值),要么即,参照完整性要求要么不参照(外码取空值),要么被参照的对
16、象必须存在被参照的对象必须存在2023年4月29日星期六数据库系统原理22参照完整性定义参照完整性定义(续续)例例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)/
17、*在表级定义参照完整性在表级定义参照完整性*/);例如,关系例如,关系SC中一个元组表示一个学生选修的某门课程的中一个元组表示一个学生选修的某门课程的成绩,(成绩,(Sno,Cno)是主码。)是主码。Sno,Cno分别参照引用分别参照引用Student表的主码和表的主码和Course表的主码表的主码2023年4月29日星期六数据库系统原理23参照完整性参照完整性(续续)n说明说明nDBMS应当支持实体完整性和参照完整性约束应当支持实体完整性和参照完整性约束n然而,与实体完整性不同,然而,与实体完整性不同,违反参照完整性存在不同的违反参照完整性存在不同的处理方案,处理方案,DBMS允许用户根据实
18、际情况选择不同的处允许用户根据实际情况选择不同的处理方法。理方法。n设设R 为参照关系,其外码为参照关系,其外码FKR;S 为被参照关系,其主码为为被参照关系,其主码为Ksn删除参照关系删除参照关系R 的元组或的元组或向被参照关系向被参照关系S 插入新元组都插入新元组都不会违反参照完整性不会违反参照完整性n在其他情况下可能破坏参照完整性在其他情况下可能破坏参照完整性2023年4月29日星期六数据库系统原理24参照完整性参照完整性(续续)n2.违反参照完整性的更新违反参照完整性的更新n向参照关系向参照关系R中插入新元组中插入新元组tRn如果不存在被参照关系如果不存在被参照关系S的元组的元组tS使
19、得使得tRFKR=tSKs,则破坏参照完整性。则破坏参照完整性。n从被参照关系从被参照关系S中删除元组中删除元组tSn如果存在参照关系如果存在参照关系R的元组的元组tR使得使得tSKs=tRFKR,则,则破坏参照完整性(删除导致破坏参照完整性(删除导致tR违反参照完整性)违反参照完整性)n修改参照关系修改参照关系R的元组的元组tR外码上的值外码上的值n如 果 不 存 在 被 参 照 关 系如 果 不 存 在 被 参 照 关 系 S 的 元 组的 元 组 tS使 得使 得new(tRFKR)=tSKs,则破坏参照完整性。其中,则破坏参照完整性。其中new(tRFKR)表示元组表示元组tR修改修改
20、后后在外码上的值在外码上的值2023年4月29日星期六数据库系统原理25参照完整性参照完整性(续续)n修改被参照关系修改被参照关系S的元组的元组tS主码上的值主码上的值n如果存在参照关系如果存在参照关系R的元组,的元组,tR 使得使得old(tSKs)=tRFKR,则破坏参照完整性(修改导致,则破坏参照完整性(修改导致tR违反参照违反参照完整性)完整性)n其中其中old(tSKs)表示元组表示元组tS修改前在主码上的值。修改前在主码上的值。n在上述四种情况下,在上述四种情况下,DBMS应当自动进行参照完整性检查,应当自动进行参照完整性检查,即下表情况即下表情况2023年4月29日星期六数据库系
21、统原理26参照完整性参照完整性(续续)被参照表(例如被参照表(例如Student)参照表(例如参照表(例如SC)违约处理违约处理可能破坏参照完整性可能破坏参照完整性 插入元组插入元组拒绝拒绝可能破坏参照完整性可能破坏参照完整性 修改外码值修改外码值拒绝拒绝删除元组删除元组 可能破坏参照完整性可能破坏参照完整性拒绝拒绝/级连删除级连删除/设置为空值设置为空值修改主码值修改主码值 可能破坏参照完整性可能破坏参照完整性拒绝拒绝/级连修改级连修改/设置为空值设置为空值2023年4月29日星期六数据库系统原理27参照完整性参照完整性(续续)n3.保证参照完整性的措施保证参照完整性的措施n当更新导致破坏参
22、照完整性时,可能的处理措施包括:当更新导致破坏参照完整性时,可能的处理措施包括:n拒绝、级联、置空值和置缺省值拒绝、级联、置空值和置缺省值n(1)拒绝:拒绝违反参照完整性的更新拒绝:拒绝违反参照完整性的更新n是最简单的处理措施是最简单的处理措施n拒绝可以用于以上拒绝可以用于以上4种情况的任何一种。种情况的任何一种。n对于表中情况对于表中情况1和和2(即向参照关系中插入新元组修即向参照关系中插入新元组修改参照关系的元组外码上的值改参照关系的元组外码上的值),一般只能拒绝。),一般只能拒绝。n对于情况对于情况3和和4(从被参照关系中删除元组修改被参从被参照关系中删除元组修改被参照关系照关系R的元组
23、主码上的值的元组主码上的值)还有其他有意义的选择)还有其他有意义的选择n当更新被拒绝时,系统应当返回一个出错信息提示用户当更新被拒绝时,系统应当返回一个出错信息提示用户2023年4月29日星期六数据库系统原理28参照完整性参照完整性(续续)n(2)级联:进行更新,并且对更新导致违反参照完整性的参级联:进行更新,并且对更新导致违反参照完整性的参照关系元组进行相应更新。具体地说,照关系元组进行相应更新。具体地说,n当删除被参照关系当删除被参照关系S中的元组中的元组tS破坏参照完整性时,同时破坏参照完整性时,同时删除参照关系删除参照关系R中所有违反参照完整性的元组中所有违反参照完整性的元组tRn修改
24、被参照关系修改被参照关系S的元组的元组tS主码上的值而破坏参照完整性主码上的值而破坏参照完整性时,同时用时,同时用tS主码上的新值修改参照关系主码上的新值修改参照关系R上违反参照完上违反参照完整性的元组整性的元组tR的外码的外码2023年4月29日星期六数据库系统原理29参照完整性参照完整性(续续)n例如例如n学号为学号为2010001的学生退学,删除的学生退学,删除Students中学号为中学号为2010001的的Students元组的同时删除元组的同时删除SC中中Sno=2010001的选课记录的选课记录n而学号为而学号为2010001的学生的学号修改为的学生的学号修改为2010030时,
25、可以时,可以同时将同时将SC中中Sno=2010001的元组的的元组的Sno修改为修改为20100302023年4月29日星期六数据库系统原理30参照完整性参照完整性(续续)n(3)置空值:进行更新,并且对更新导致违反参照完整性的置空值:进行更新,并且对更新导致违反参照完整性的参照关系元组的外码置空值参照关系元组的外码置空值n这种处理方法仅当外码允许取空值时才能使用这种处理方法仅当外码允许取空值时才能使用n 例如,如果允许教师所在院系属性取空值(尚未分配例如,如果允许教师所在院系属性取空值(尚未分配到具体院系),当学校的某个院系撤销时,可以在删到具体院系),当学校的某个院系撤销时,可以在删除
26、该 院 系 在除 该 院 系 在 D e p a r t m e n t s 中 的 记 录 的 同 时 将中 的 记 录 的 同 时 将TEACHERS中相应教师的所在院系属性置空值中相应教师的所在院系属性置空值n(4)置缺省值:进行更新,并且对更新导致违反参照完整性置缺省值:进行更新,并且对更新导致违反参照完整性的参照关系元组的外码置缺省值;其中缺省值必须是被参的参照关系元组的外码置缺省值;其中缺省值必须是被参照关系某元组主码上的值照关系某元组主码上的值nDBMS应当提供上述处理措施,用户可根据具体情况进行选应当提供上述处理措施,用户可根据具体情况进行选择择2023年4月29日星期六数据库
27、系统原理31SQL对参照完整性的支持对参照完整性的支持n外码可以在创建基本表时用外码可以在创建基本表时用FOREIGN KEY子句说明子句说明,形式形式为:为:FOREIGN KEY(A1,Ak)REFERENCES ()n指出修改和删除违反参照完整性约束时指出修改和删除违反参照完整性约束时触发的动作;缺省时,违反参照完整性的修改和删除将触发的动作;缺省时,违反参照完整性的修改和删除将被拒绝。被拒绝。2023年4月29日星期六数据库系统原理32SQL对参照完整性的支持对参照完整性的支持(续续)n可以是如下两种形式之一:可以是如下两种形式之一:ON UPDATE ON DELETE ON DEL
28、ETE ON UPDATE n其中其中可以是可以是CASCADE、SET NULL、SET DEFAULT和和NO ACTION 之一,分别表示之一,分别表示级联、置空值、级联、置空值、置缺省值置缺省值和和拒绝拒绝nON DELETE 缺省时,违反参照完整性的删缺省时,违反参照完整性的删除将被拒绝除将被拒绝nON UPDATE 缺省时,违反参照完整性的修缺省时,违反参照完整性的修改将被拒绝改将被拒绝2023年4月29日星期六数据库系统原理33SQL对参照完整性的支持对参照完整性的支持(续续)n例例5.1 在前面,我们定义了在前面,我们定义了Students、Courses和和SC等基本表等基本
29、表n如果我们希望在更新如果我们希望在更新Students元组的主码时同时修改相元组的主码时同时修改相应的应的SC元组的外码元组的外码Sno,删除,删除Students的元组时同时删除的元组时同时删除相应的相应的SC元组;而更新元组;而更新Courses的元组时同时修改相应的元组时同时修改相应的的SC元组的外码元组的外码Cno,但不允许删除,但不允许删除Courses的元组破坏的元组破坏参照完整性,则我们可以用如下语句创建基本表参照完整性,则我们可以用如下语句创建基本表SC:2023年4月29日星期六数据库系统原理34SQL对参照完整性的支持对参照完整性的支持(续续)CREATE TABLE S
30、C(Sno CHAR(9),Cno CHAR(5),Grade SMALLINT CHECK(Grade=0 AND Grade=100),PRIMARY KEY(Sno,Cno),FOREIGN KEY(Sno)REFERENCES Students(Sno)ON UPDATE CASCADE ON DELETE CASCADE,FOREIGN KEY(Cno)REFERENCES Courses(Cno)ON UPDATE CASCADE );5.3 用户定义的完整性用户定义的完整性2023年4月29日星期六数据库系统原理36用户定义的完整性用户定义的完整性n不同的关系数据库根据其应用环境
31、的不同,往往还需要一不同的关系数据库根据其应用环境的不同,往往还需要一些特殊的约束条件些特殊的约束条件n用户定义的完整性即是针对某个特定关系数据库的约束条用户定义的完整性即是针对某个特定关系数据库的约束条件,它反映件,它反映某一具体应用所涉及的数据必须满足的语义要某一具体应用所涉及的数据必须满足的语义要求求n系统提供定义和检验这类完整性的统一处理方法,不再由系统提供定义和检验这类完整性的统一处理方法,不再由应用程序承担这项工作应用程序承担这项工作2023年4月29日星期六数据库系统原理37用户定义的完整性用户定义的完整性n1.属性约束属性约束n属性上的约束是属性上的约束是指属性的取值必须来自其
32、定义的值域指属性的取值必须来自其定义的值域n例如,可以规定学生成绩的取值范围为例如,可以规定学生成绩的取值范围为-100,性别的,性别的取值为取值为“男男”或或“女女”等等n插入新元组和修改元组的属性值可能导致违反属性约束。插入新元组和修改元组的属性值可能导致违反属性约束。nDBMS应当在插入或修改前进行属性约束检查。如果违应当在插入或修改前进行属性约束检查。如果违反属性约束,插入或删除将被拒绝。反属性约束,插入或删除将被拒绝。2023年4月29日星期六数据库系统原理385.3 用户定义的完整性用户定义的完整性n5.3.1 属性上的约束条件的定义属性上的约束条件的定义n5.3.2 属性上的约束
33、条件检查和违约处理属性上的约束条件检查和违约处理 n5.3.3 元组上的约束条件的定义元组上的约束条件的定义 n5.3.4元组上的约束条件检查和违约处理元组上的约束条件检查和违约处理2023年4月29日星期六数据库系统原理395.3.1 属性上的约束条件的定义属性上的约束条件的定义nCREATE TABLE时定义时定义n列值非空(列值非空(NOT NULL)n列值唯一(列值唯一(UNIQUE)n检查列值是否满足一个布尔表达式(检查列值是否满足一个布尔表达式(CHECK)2023年4月29日星期六数据库系统原理40属性上的约束条件的定义属性上的约束条件的定义(续续)n不允许取空值不允许取空值例例
34、5 在定义在定义SC表时,说明表时,说明Sno、Cno、Grade属性不允属性不允许取空值。许取空值。CREATE TABLE SC (Sno CHAR(9)NOT NULL,Cno CHAR(4)NOT NULL,Grade SMALLINT NOT NULL,PRIMARY KEY(Sno,Cno)););如果在表级定义实体完整性,隐含了如果在表级定义实体完整性,隐含了Sno,Cno不允许取不允许取空值,则在列级不允许取空值的定义就不必写了空值,则在列级不允许取空值的定义就不必写了 2023年4月29日星期六数据库系统原理41属性上的约束条件的定义属性上的约束条件的定义(续续)n列值唯一列
35、值唯一 例例6 建立部门表建立部门表DEPT,要求部门名称,要求部门名称Dname列取值唯列取值唯一,部门编号一,部门编号Deptno列为主码列为主码 CREATE TABLE DEPT (Deptno NUMERIC(2),Dname CHAR(9)UNIQUE,/*要求要求Dname列值唯一列值唯一*/Location CHAR(10),PRIMARY KEY(Deptno);2023年4月29日星期六数据库系统原理42属性上的约束条件的定义属性上的约束条件的定义(续续)n 用用CHECK短语指定列值应该满足的条件短语指定列值应该满足的条件例例7 Student表的表的Ssex只允许取只允
36、许取“男男”或或“女女”。CREATE TABLE Student (Sno CHAR(9)PRIMARY KEY,Sname CHAR(8)NOT NULL,Ssex CHAR(2)CHECK(Ssex IN(男男,女女),/*性别属性性别属性Ssex只允许取只允许取男男或或女女*/Sage SMALLINT,Sdept CHAR(20);2023年4月29日星期六数据库系统原理435.3 用户定义的完整性用户定义的完整性n5.3.1 属性上的约束条件的定义属性上的约束条件的定义n5.3.2 属性上的约束条件检查和违约处理属性上的约束条件检查和违约处理 n5.3.3 元组上的约束条件的定义元
37、组上的约束条件的定义 n5.3.4元组上的约束条件检查和违约处理元组上的约束条件检查和违约处理2023年4月29日星期六数据库系统原理445.3.2 约束条件检查和违约处理约束条件检查和违约处理n插入元组或修改属性的值时,插入元组或修改属性的值时,RDBMS检查属性上检查属性上的约束条件是否被满足的约束条件是否被满足n如果不满足则操作被拒绝执行如果不满足则操作被拒绝执行 2023年4月29日星期六数据库系统原理455.3 用户定义的完整性用户定义的完整性n5.3.1 属性上的约束条件的定义属性上的约束条件的定义n5.3.2 属性上的约束条件检查和违约处理属性上的约束条件检查和违约处理 n5.3
38、.3 元组上的约束条件的定义元组上的约束条件的定义 n5.3.4元组上的约束条件检查和违约处理元组上的约束条件检查和违约处理2023年4月29日星期六数据库系统原理465.3.3 元组上的约束条件的定义元组上的约束条件的定义n在在CREATE TABLE时可以用时可以用CHECK短语定义元组上的约短语定义元组上的约束条件,即束条件,即元组级的限制元组级的限制n同属性值限制相比,元组级的限制可以设置不同属性之间同属性值限制相比,元组级的限制可以设置不同属性之间的取值的相互约束条件的取值的相互约束条件 2023年4月29日星期六数据库系统原理47元组上的约束条件的定义元组上的约束条件的定义(续续)
39、CREATE TABLE Student (Sno CHAR(9),Sname CHAR(8)NOT NULL,Ssex CHAR(2),Sage SMALLINT,Sdept CHAR(20),PRIMARY KEY(Sno),CHECK(Ssex=女 OR Sname NOT LIKE Ms.%)/*定义了元组中定义了元组中Sname和和 Ssex两个属性值之间的约束条件两个属性值之间的约束条件*/);性别是女性的元组都能通过该项检查,因为性别是女性的元组都能通过该项检查,因为Ssex=女女成立;成立;当性别是男性时,要通过检查则名字一定不能以当性别是男性时,要通过检查则名字一定不能以Ms
40、.打头打头例例9 当学生的性别是男时,其名字不能以当学生的性别是男时,其名字不能以Ms.打头。打头。2023年4月29日星期六数据库系统原理485.3 用户定义的完整性用户定义的完整性n5.3.1 属性上的约束条件的定义属性上的约束条件的定义n5.3.2 属性上的约束条件检查和违约处理属性上的约束条件检查和违约处理 n5.3.3 元组上的约束条件的定义元组上的约束条件的定义 n5.3.4 元组上的约束条件检查和违约处理元组上的约束条件检查和违约处理2023年4月29日星期六数据库系统原理495.3.4 元组上的约束条件检查和违约处理元组上的约束条件检查和违约处理n插入元组或修改属性的值时,插入
41、元组或修改属性的值时,RDBMS检查元组上的约束条检查元组上的约束条件是否被满足件是否被满足n如果不满足则操作被拒绝执行如果不满足则操作被拒绝执行 2023年4月29日星期六数据库系统原理50第五章第五章 数据库完整性数据库完整性5.4 完整性约束命名子句完整性约束命名子句2023年4月29日星期六数据库系统原理515.4 完整性约束命名子句完整性约束命名子句nCONSTRAINT 约束约束CONSTRAINT PRIMARY KEY短语短语|FOREIGN KEY短语短语|CHECK短语短语 2023年4月29日星期六数据库系统原理52完整性约束命名子句完整性约束命名子句(续续)例例10 建
42、立学生登记表建立学生登记表Student,要求学号在,要求学号在9000099999之间,姓名不能取空值,年龄小于之间,姓名不能取空值,年龄小于30,性别只能是性别只能是“男男”或或“女女”。2023年4月29日星期六数据库系统原理53完整性约束命名子句完整性约束命名子句(续续)CREATE TABLE Student (Sno NUMERIC(6)CONSTRAINT C1 CHECK(Sno BETWEEN 90000 AND 99999),Sname CHAR(20)CONSTRAINT C2 NOT NULL,Sage NUMERIC(3)CONSTRAINT C3 CHECK(Sag
43、e 30),Ssex CHAR(2)CONSTRAINT C4 CHECK(Ssex IN(男男,女女),CONSTRAINT StudentKey PRIMARY KEY(Sno);2023年4月29日星期六数据库系统原理54完整性约束命名子句完整性约束命名子句(续续)n在在Student表上建立了表上建立了5个约束条件,包括主码约束个约束条件,包括主码约束(命名为(命名为StudentKey)以及)以及C1、C2、C3、C4四个四个列级约束。列级约束。n 修改表中的完整性限制修改表中的完整性限制n使用使用ALTER TABLE语句修改表中的完整性限制语句修改表中的完整性限制2023年4月2
44、9日星期六数据库系统原理55完整性约束命名子句完整性约束命名子句(续续)例例13 修改表修改表Student中的约束条件,要求学号改中的约束条件,要求学号改为在为在900000999999之间,年龄由小于之间,年龄由小于30改为小于改为小于402023年4月29日星期六数据库系统原理56完整性约束命名子句完整性约束命名子句(续续)n可以先删除原来的约束条件,再增加新的约束条件可以先删除原来的约束条件,再增加新的约束条件 ALTER TABLE Student DROP CONSTRAINT C1;ALTER TABLE Student ADD CONSTRAINT C1 CHECK(Sno B
45、ETWEEN 900000 AND 999999);ALTER TABLE Student DROP CONSTRAINT C3;ALTER TABLE Student ADD CONSTRAINT C3 CHECK(Sage 40);5.5 触发器触发器2023年4月29日星期六数据库系统原理58触发器触发器n触发器(触发器(trigger)是特殊类型的存储过程,当某个事件发生时它自动执)是特殊类型的存储过程,当某个事件发生时它自动执行。行。n要设置触发器机制,必须满足两个要求:要设置触发器机制,必须满足两个要求:(1)指明什么事件发生和满足什么条件执行触发器;指明什么事件发生和满足什么条件
46、执行触发器;(2)指明触发器执行什么样的动作。指明触发器执行什么样的动作。n这种模型称作这种模型称作事件事件-条件条件-动作动作模型模型n数据库系统将像保存数据一样存储触发器。只要指定的事件发生,数据库系统将像保存数据一样存储触发器。只要指定的事件发生,触发条件满足,相应的存储过程就被执行。触发条件满足,相应的存储过程就被执行。n触发器的其他作用触发器的其他作用n例如,一个定时触发器可以在每个周末主动地制作某些定制的报表,例如,一个定时触发器可以在每个周末主动地制作某些定制的报表,而不必在用户要求之后才被动地完成这些任务。而不必在用户要求之后才被动地完成这些任务。2023年4月29日星期六数据
47、库系统原理59触发器触发器(续续)n1.为何需要触发器为何需要触发器nDBMS提供了多种完整性约束定义和检查机制。然而,除了允许对提供了多种完整性约束定义和检查机制。然而,除了允许对违反参照完整性约束的删除和修改进行级联删除和修改外,违反完违反参照完整性约束的删除和修改进行级联删除和修改外,违反完整性约束的更新都被简单地拒绝。整性约束的更新都被简单地拒绝。n触发器对示警或满足特定条件时自动执行某项任务是非常有用的,触发器对示警或满足特定条件时自动执行某项任务是非常有用的,对实现复杂的完整性约束(如参照完整性不能覆盖的复杂约束)也对实现复杂的完整性约束(如参照完整性不能覆盖的复杂约束)也是有用的
48、。是有用的。n两个例子:两个例子:n银行的透支处理:银行允许用户透支,但存款余额不能取负值。透支(存银行的透支处理:银行允许用户透支,但存款余额不能取负值。透支(存款余额小于零)时可以将存款余额置零,并同时建立一笔贷款,其金额等款余额小于零)时可以将存款余额置零,并同时建立一笔贷款,其金额等于透支额。这样,当存款余额更新后小于零时不是简单地拒绝更新,而是于透支额。这样,当存款余额更新后小于零时不是简单地拒绝更新,而是触发一系列动作完成上述任务,同时避免破坏完整性约束。触发一系列动作完成上述任务,同时避免破坏完整性约束。n存货预警:当库存量下降到最小库存量以下时,自动提示仓库管理人员订存货预警:
49、当库存量下降到最小库存量以下时,自动提示仓库管理人员订货或自动产生一个订单。自动触发一个过程来完成上述任务货或自动产生一个订单。自动触发一个过程来完成上述任务。2023年4月29日星期六数据库系统原理605.6 触发器触发器n5.6.1 定义触发器定义触发器 n5.6.2 激活触发器激活触发器 n5.6.3 删除触发器删除触发器 2023年4月29日星期六数据库系统原理615.6.1 定义触发器定义触发器nCREATE TRIGGER语法格式语法格式 CREATE TRIGGER BEFORE|AFTER ON FOR EACH ROW|STATEMENT WHEN 2023年4月29日星期六
50、数据库系统原理62定义触发器定义触发器(续续)n定义触发器的语法说明定义触发器的语法说明:n1.创建者:表的创建者:表的拥有者拥有者n2.触发器名触发器名n3.表名:触发器的目标表表名:触发器的目标表n4.触发事件:触发事件:INSERT、DELETE、UPDATEn5.触发器类型触发器类型行级触发器(行级触发器(FOR EACH ROW)语句级触发器(语句级触发器(FOR EACH STATEMENT)2023年4月29日星期六数据库系统原理63定义触发器定义触发器(续续)n例如例如,假设在例假设在例11的的TEACHER表上创建了一个表上创建了一个AFTER UPDATE触触发器。如果表发