第五章数据库的完整性

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
An Introduction to Database System
参照完整性的违约处理
2、参照完整性违约处理 、 create table course ( cno char(4) primary key, cname char(40) not null, cpno char(4), credit smallint, constraint fk_cpno foreign key(cpno) references course(cno) on delete set null on update cascade )
An Introduction to Database System
约束
约束:就是一种强制性的规定。 约束:就是一种强制性的规定。 SQL Server的六种约束: 的六种约束: 的六种约束 • not null 非空约束 • check 检查约束 • unique 唯一约束 • primary key 主码约束 • foreign key 外码约束 • default 默认约束 约束的建立: 约束的建立: • 在创建表的同时建立 • 在已有表上建立 注意:若表中已有数据,则建立 注意:若表中已有数据, 约束时可能会失败。 约束时可能会失败。 1、建立非空约束: 、建立非空约束: alter table course alter column credit smallint not null 其中,必须给出列的类型。 其中,必须给出列的类型。 2、建立唯一约束: 、建立唯一约束: alter table course add constraint UQ_cname unique(cname) 其中, 其中,constraint关键词对该约束进 关键词对该约束进 行命名, 行命名,即UQ_cname是对该约 是对该约 束的约束名 约束名。 束的约束名。 注意:对每个约束都进行命名是个 注意: 好习惯。 好习惯。
第五章 数据库完整性
• 数据库的安全性是尽可能保证非法用户不破坏数据的正确性。 数据库的安全性是尽可能保证非法用户不破坏数据的正确性。 • 数据库的完整性是尽可能保证合法用户不破坏数据的正确性。 数据库的完整性是尽可能保证合法用户不破坏数据的正确性。 问题:你还记得实体完整性约束和参照完整性约束是怎么回事吗? 问题:你还记得实体完整性约束和参照完整性约束是怎么回事吗? 数据的完整性是为了防止数据库中存在不符合语义的数据。 数据的完整性是为了防止数据库中存在不符合语义的数据。 为此, 需要完成: 为此,DBMS需要完成: 需要完成 • 提供定义完整性约束条件的机制 • 提供完整性检查的方法 • 违约处理 完整性分类:实体完整性、 完整性分类:实体完整性、参照完整性和用户定义完整性
An Introduction to Database System
default 约束、删除约束 约束、
default约束可以对列设置默认值。如对性别列默认取值为男。 约束可以对列设置默认值。如对性别列默认取值为男。 约束可以对列设置默认值 1、创建表时建立default约束: 、创建表时建立 约束: 约束 create table student ( sno char(9) primary key, ssex char(2) constraint c_ssex_def default '男' ) '男 2、在表中增加default约束: 、在表中增加 约束: 约束 alter table student add constraint c_ssex_def default '男' for ssex 男 删除约束: 删除约束: alter table 表名 drop constraint 约束名 如: alter table student drop constraint c_ssex_def 注意:表中的约束不能修改,只能删除后重建。 注意:表中的约束不能修改,只能删除后重建。
An Introduction to Database System
触发器
触发器:是用户定义在关系表上的一类由事件驱动的特殊过程。 触发器:是用户定义在关系表上的一类由事件驱动的特殊过程。 常用事件: 常用事件:insert、delete、update(即数据更新操作) 、 、 (即数据更新操作) 定义触发器的一般格式: 定义触发器的一般格式: create trigger <trigger_name> on { table_name | view_name } { for | after | instead of } { [insert] [,] [delete] [,] [update] } as begin T-SQL statement end 例如: 例如: 问题: 问题: create trigger insert_student 这段程序什么时候被执行? ① 这段程序什么时候被执行? on student 若将事件insert写成 写成delete或update, ② 若将事件 写成 或 , for insert 或它们的组合会怎样? 或它们的组合会怎样? as begin 触发器有什么用? ③ 触发器有什么用? print 'Hi trigger!' An Introduction to Database System end
An Introduction to Database System
check 约束
1、创建表时建立check约束: 、创建表时建立 约束: 约束 create table stu ( sno char(9) constraint PK_stu primary key, 逻辑表达式 name char(8) not null, age smallint constraint c_age check(age > 0 and age < 100) ) 或 create table stu ( sno char(9), 问题:此时age列值可以是空吗 列值可以是空吗? 问题:此时 列值可以是空吗? name char(8) not null, age smallint, constraint PK_stu primary key (sno), constraint c_age check (age > 0 and age < 100) ) 2、在表中增加check约束 、在表中增加 约束 alter table student add constraint c_age check(age > 0 and age < 100)
已被绑定的wenku.baidu.com则会删除失败
An Introduction to Database System
默认值
默认值:作用与 约束相同, 默认值:作用与default约束相同,用法类似于规则。 约束相同 用法类似于规则。 1、默认值的创建 、 默认名 create default def_sex as '男' 男 此处为常量表达式 2、将默认值绑定到表的列 、 exec sp_bindefault 'def_sex', 'student.ssex' 3、取消表列的默认绑定 、 exec sp_unbindefault 'student.sdept' 4、删除默认值 、 drop default def_sex
create table sc ( sno char(9), cno char(4), grade smallint, primary key(sno, cno), constraint fk_sno foreign key(sno) references student(sno) on delete cascade 注意: 注意:在表自身上建立的外键违约处理 on update cascade, SQL Server并不接受。 并不接受。 并不接受 constraint fk_cno foreign key(cno) 问题:难道没办法实现这一功能要求吗? 问题:难道没办法实现这一功能要求吗? references course(cno) on delete no action 若违约处理没明确给出,则默认为no 若违约处理没明确给出,则默认为 action。 。 on update cascade )
An Introduction to Database System
定义规则的条件,即逻辑表达式。 定义规则的条件,即逻辑表达式。 其中的局部变量引用通过update 或 其中的局部变量引用通过 insert语句输入的值。 语句输入的值。 语句输入的值
规则(续) 规则(
create rule pattern_rule as @value like '_ _-%[0-9]' 2、将规则绑定到表的列 、 exec sp_bindrule 'range_rule', 'student.sage' exec sp_bindrule 'range_rule', 'sc.grade' 该列即受绑定规则的约束 3、取消表列的规则绑定 、 exec sp_unbindrule 'student.sage' 4、删除规则 、 drop rule range_rule 该列解除规则约束
An Introduction to Database System
若该列已定义了default约 约 若该列已定义了 则该绑定会失败。 束,则该绑定会失败。
完整性的违约处理
1、实体完整性违约处理 、 实体完整性是通过在表中定义主码来实现。当更新操作违反了实体完 实体完整性是通过在表中定义主码来实现。 整性,则该更新操作被拒绝执行。 整性,则该更新操作被拒绝执行。 2、参照完整性违约处理 、 问题: 问题: ① 在SC表插入违反了参照完整性的数据时,你认为怎么处理合理? 表插入违反了参照完整性的数据时,你认为怎么处理合理? 表插入违反了参照完整性的数据时 ② 将1号学生从 号学生从Student表删除,若他已选课,你认为对SC表怎么处理合理? 表删除,若他已选课,你认为对 表怎么处理合理? 号学生从 表删除 表怎么处理合理 ③ 将1号学生的学号改为 号,你认为对SC表怎么处理合理? 号学生的学号改为10号 你认为对 表怎么处理合理? 号学生的学号改为 表怎么处理合理 ④ 将1号课从 号课从Course表删除,若2号课的先行课为 号,则怎么做合理? 表删除, 号课的先行课为1号 则怎么做合理? 号课从 表删除 号课的先行课为 ⑤ 将1号课编号改为 号,若2号课的先行课为 号,则怎么做合理? 号课编号改为10号 号课的先行课为1号 则怎么做合理? 号课编号改为 号课的先行课为 3、用户定义完整性违约,则拒绝执行。 、用户定义完整性违约,则拒绝执行。
An Introduction to Database System
check 约束(续) 约束(
3、check的表达式可以包含多个属性。如规定CS系学生必须 25岁以下: 、 的表达式可以包含多个属性。如规定 系学生必须 岁以下: 的表达式可以包含多个属性 岁以下 alter table student add constraint c_cs_age check(sdept <> 'cs' or sage <= 25) 问题:你知道这个约束条件是怎么得到的吗? 问题:你知道这个约束条件是怎么得到的吗? 4、规定性别的取值只能是男或女: 、规定性别的取值只能是男或女: alter table student add constraint c_ssex check(ssex in ('男', '女')) 男 女 问题:此时ssex列值可空吗? 问题:此时 列值可空吗? 列值可空吗 alter table student add constraint c_ssex check(ssex in ('男', '女', null)) 男 女
An Introduction to Database System
规则
规则:可用来限制属性取值的范围,实现强制数据的域完整性, 规则:可用来限制属性取值的范围,实现强制数据的域完整性,作用类似 约束。 于check约束。 约束 • check约束可针对一个属性多次应用 约束可针对一个属性多次应用 • 一个属性只能应用一个规则 • 规则需要单独创建,也只需创建一次,以后可多次应用于多个表 规则需要单独创建,也只需创建一次, 1、规则的创建 、 规则名 create rule range_rule as @range > 0 and @range < 100 create rule list_rule as @list in ('男', '女', null) 男 女
相关文档
最新文档