第五章 数据库完整性
第5章sql数据库完整性约束

5.2.4 默认值(DEFAULT)约束
默认约束是指在用户未提供某些列的数据时,数据库 系统为用户提供的默认值。从而简化应用程序代码和提高 系统性能。 表的每一列都可包含一个DEFAULT定义。可以修改或 删除现有的DEFAULT定义,但必须首先删除已有的 DEFAULT定义,然后通过新定义重新创建。 1.利用Management Studio定义(删除)default约束 步骤1:右键要建立default约束的表选择“修改”。 步骤2:在弹出的窗口中对应字段的“默认值或绑定”处 输入默认值。 步骤3:点击保存即可。
PRIMARY KEY约束在表中定义一个主键,唯一的标 识表中的行。一个表只能有一个PRIMARY KEY约束。
当向表中的现有列添加PRIMARY KEY约束时,SQL Server将检查列中现有的数据以确保现有数据遵从主键的 规则,即无空值、无重复值。 每个表都应有一个主键。主键可以是一列或列组合。
CREATE TABLE kc_new (5-4)
(课程号 CHAR(4) NOT NULL CONSTRAINT pk_kch1 PRIMARY KEY, 课程名 CHAR(16) NOT NULL CONSTRAINT ix_kcm1 UNIQUE,
学分 SMALLINT,
第5章 数据库完整性

第5章数据库安全性(2课时)数据库的数据保护主要包括数据的安全性和数据的完整性。
数据的安全性是为了保护数据库防止恶意的破坏和非法访问,防范对象是非法用户和非法操作。
数据库的完整性是指数据的正确性和相容性,是为了防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正确的数据,防范对象是不合语义的、不正确的数据。
举例说明数据的完整性(三种完整性各一例)。
为维护数据库的完整性,DBMS必须具备三个功能:1 提供定义完整性约束条件的机制完整性约束条件也称为完整性约束规则,是数据库必须满足的语义约束条件。
SQL标准使用了一系列概念来描述完整性,包括关系模型的实体完整性、参照完整性和用户定义完整性。
这些完整性一般由SQL的DDL语句来实现。
它们作为数据库模式的一部分存入数据字典中。
2 提供完整性检查的方法DBMS中检查数据是否满足完整性约束条件的机制称为完整性检查。
一般在INSERT、UPDA TE、DELETE语句执行后开始检查,也可以在事务提交时检查。
检查这些操作执行后数据库中的数据库是否违背了完整性约束条件。
3 违约处理DBMS若发现用户的操作违背了完整性约束条件,就采取一定的动作,如拒绝(NOACTION)执行该操作,或级联(CASCADE)执行其他操作,进行违约处理以保证数据的完整性。
目前商用的DBMS产品都支持完整性控制,即完整性定义、检查控制和违约处理都是由DBMS来实现,不必由应用程序来完成,从而减轻了应用程序员的负担。
5.1 实体完整性是关系的两个不变性之一,关系的主属性的取值不能相同,主属性不能取空值,保证在一个关系中不存在两个完全相同的元组。
5.1.1 实体完整性定义关系模型的实体完整性在CREATE TABLE中用PRIMARY KEY定义。
对单属性构成的码有两种说明方法:一种是定义为列级约束条件;一种是定义为表级约束条件。
对多个属性构成的码只有一种说明方法:定义为表级约束条件。
第5章数据库完整性

4. 修改被参照关系中主码的问题
两种策略 不允许修改主码 允许修改主码 违约操作 要修改被参照关系中某些元组的主码值,而 修改被参照关系中某些元组的主码值 中某些元组的主码值, 参照关系中有些元组的外码值正好等于被参 照关系要修改的主码值,如修改Student学号; 照关系要修改的主码值,如修改 学号; 学号
受限插入:系统将拒绝向 关系插入 关系插入( 受限插入:系统将拒绝向SC关系插入(99001, , 1,90)元组. , )元组. 递归插入:系统将首先向 递归插入:系统将首先向Student关系插入 关系插入 Sno=99001的元组,然后向 关系插入 的元组, 的元组 然后向SC关系插入 (99001,1,90)元组. , , )元组.
级联修改 修改被参照关系中主码值同时, 修改被参照关系中主码值同时,用相同的方法修改 参照关系中相应的外码值; 参照关系中相应的外码值; 受限修改 拒绝此修改操作. 拒绝此修改操作.只当参照关系中没有任何元组的 外码值等于被参照关系中某个元组的主码值时, 外码值等于被参照关系中某个元组的主码值时,这 个元组的主码值才能被修改; 个元组的主码值才能被修改; 置空值修改 修改被参照关系中主码值, 修改被参照关系中主码值,同时将参照关系中相应 的外码值置为空值; 的外码值置为空值;
实体完整性
表中的Sno, Cno定义为码 例:将SC表中的 表中的 定义为码
CREATE TABLE SC ( Sno CHAR(7) NOT NULL, Cno CHAR(4) NOT NULL, Grade SMALLINT, PRIMARY KEY (Sno, Cno), );
实体完整性
实体完整性检查和违约处理
3.在参照关系中插入元组时的问题 在参照关系中插入元组时的问题
数据库应用基础第五章数据完整性

5.2 约束的类型
1 PRIMARY KEY 约束 2 FOREIGN KEY 约束 3 UNIQUE 约束 4 CHECK 约束 5 DEFAULT 约束
13
约束是一种强制数据完整性的 book_id borrower_id lend_date back_date
标准机078制9 。 960651
[[CONSTRAINT constraint_name] {PRIMARY KEY
所在列的数据类型
[CLUSTERED|NONCLUSTERED]
创建约[C束LU的S列|TUE的RN名EIQD称|UNEONCLUSTERED] |[FOREIGN KEY] REFERENCES新建约束的名称
ref_table [(ref_column)]
(3)引用完整性 引用完整性用于在输入或删除记录
时,例:保对持于表之Lib间ra已ry定_D义B数的据关库系中。的
book_info 表和 class 表,引用完整性 基于 book_info 表中的外键 (class_id) 与 class 表中的主键 (class_id) 之间 的关系 。
8
1 数据完整性的类型
{(column_name[,...])}
24
② FOREIGN KEY 约束
ALTER TABLE table_name
被FOREIGN
ADD CONSTRAINT constrainKtE_Yn约a束m参e 照的表的名
FOREIGN KEY {(column_nam称e[,...])} REFERENCES ref_table {(column_name[,...])} [ON DELETE {CASCADE|NO ACTION}] [ON UPDATE {CASCADE|NO ACTION}]
数据库完整性

在student表上建立了了5个约束条件,包括主码约束
以及c1,c2,c3,c4四个列级约束。
2.修改表中的完整性限制
可以使用alter table语句修改表中的完整性约
束。
例:去掉student表中对性别的限制。 Alter table student drop constraint c4
5.6.1 定义触发器
SQL使用CREATE TRIGGER 命令建立触发
器,其一般格式为:
CREATE TRIGGER <触发器名> | BEFORE | AFTER | <触发器事件> ON <表名> FOR EACH {ROW | STATEMENT} [ WHEN <触发条件>] <触发动作体>
5.6.2 激活触发器
触发器的执行是由触发事件激活的,并
由数据库服务器自动执行的。 同一个表上的多个触发器激活的顺序为:
执行该表上的BEFORE触发器; 激活触发器的SQL语句; 执行该表上的AFTER触发器
5.6.3 删除触发器
DROP TRIGGER <触发器名>
ON <表名>;
例:定义一个BEFORE行级触发器,为教师表
TEACHER定义完整性规则“教授的工资不得 低于4000,如果低于4000元,自动改为4000 元”。
CREATE TRIGGER insert_or_update_sal BEFORE INSERT OR UPDATE ON teacher FOR EACH ROW AS BEGIN IF ( new.pJob=’教授’) and ( new.sal<4000) THEN New.sal:=4000; END IF; END;
第五章 数据库完整性

例2:将SC表中的SNO、cno属性组定义为码 create table sc (sno char(9) not null, cno char(4) not null, grade smallint, primary key(sno,cno) )
8
5.1.2 实体完整性的违约处理
对于实体完整性的检查,包括:
在子表中修改外码(也是主属性)的策略
6. 在参照关系(子表)中修改外码(同时是主码 属性 )。与在参照关系中插入元组类似,可以 有2种策略: 受限修改 递归修改 RDBMS在实现参照完整性时: 需要向用户提供定义主码、外码的机制。 向用户提供按照自己的应用要求选择处理依 赖关系中对应的元组的方法。
6
5.1 实体完整性
5.1.1 定义实体完整性 例1:将student表中的sno属性定义为码 create table student (sno char(9) primary key, sname char(20) not null, ssex char(2), sage smallint, sdept char(20) )
26
5.4 完整性约束命名子句
1. 完整性约束命名子句 Constraint <完整性约束条件名><完整性约 束条件> 例5.10 建立学生登记表 student,要求学号在 90000—99999 之间,姓名不能取空值,年 龄小于30,性别只能是“男”或者“女”
5
数据库完整性控制机制
DBMS完整性控制机制: 1. 提供定义完整性约束条件的机制:提供定义数 据完整性约束条件的方法,完整性约束条件作为 模式的一部分存入数据库中; 2. 提供完整性检查的方法:进行完整性检查,检 查数据是否满足约束条件; 3. 进行违约处理:若有违反,采取相应措施(拒 绝、报告、改正)处理。 完整性子系统:DBMS中执行完整性控制的子系统。 其功能为监督事务的执行,测试其是否违反完整性 约束条件;若有违反,则分情况进行预定的处理。
第五章_数据库完整性(习题)

一、选择题1.完整性检查和控制的防范对象是(),防止它们进入数据库。
安全性控制的防范对象是(),防止他们对数据库数据的存取。
A.不合语义的数据B.非法用户C.不正确的数据D.非法操作2.找出下面SQL命令中的数据控制命令()。
A.GRANTMITC.UPDA TED.SELECT3.下述SQL命令中,允许用户定义新关系时,引用其他关系的主码作为外码的是()。
A.INSERTB.DELETEC.REFERENCESD. SELECT4.下述SQL命令的短语中,不用于定义属性上约束条件的是()。
A.NOT NULL短语B.UNIQUE短语C.CHECK短语D.HA VING短语二、填空题1.数据库的完整性是指数据的正确性和相容性。
2.关系模型的实体完整性在CREATE TABLE中用primary key 关键字来实现。
3.检查主码值出现不唯一和有一个为空违约情况时,则DBMS拒绝插入或修改。
4.关系模型的参照完整性在CREATE TABLE中用foreign key关键字来实现。
5.当参照完整性检查出现违约情况时,则DBMS可以采用拒绝、级联和设置为空策略处理。
6.参照完整性的级连操作的关键字是cascade 。
7.在CREA TE TABLE中定义属性上的约束条件,包括not null 、unique 和check。
8.在CREA TE TABLE中定义属性上的约束条件,检查列值唯一用unique 关键字。
9.关系模型的元组上的约束条件的定义,在CREATE TABLE中用check关键字来实现。
10.在Sno(学号)列上创建约束,要求Sno的值在18至22岁之间,约束名Sno_CK。
请写出对应的完整性命名子句constraint Sno_CK primary key check(sno between 18 and 22)。
1.A C ;BD 2. A 3. C 4. D三、综合题1.假设有下面两个关系模式:职工(职工号,姓名,年龄,职务,工资,部门号),其中职工号为主码;部门(部门号,名称,经理名,电话),其中部门号为主码。
05_数据库完整性

全表扫描.依次判断表中每条记录的主码值与 将插入记录上的主码值(或修改的新主码值) 是否相同.十分耗时. 在主码上自动建立索引(如B+树索引).可大 大提高效率.
5.2 参照完整性
5.2.1 参照完整性定义
在CREATE TABLE中用FOREIGN KEY短语来定 义哪些列为外码,用REFERENCES短语指明这 些外码参照哪些表的主码. 见课本P154 [例3]
定义触发器(续)
INSERT,UPDATE和DELETE三个选项是指定在表或视图 上执行哪些数据修改语句时将激活触发器的关键字.必须 至少指定一个选项.在触发器定义中允许使用以任意顺序 组合的这些关键字.如果指定的选项多于一个,需用逗号 分隔这些选项. AS后是触发器要执行的操作. CREATE TRIGGER 权限默认授予定义触发器的表所有者, sysadmin 固定服务器角色成员以及 db_owner 和 db_ddladmin 固定数据库角色成员,并且不可转让.
ALTER TABLE <表名> DROP < 完整性约束条件名>
5.6 触发器(Trigger)
触发器是用户定义在关系表上的一类由事件驱动的 特殊过程.一旦定义,任何用户对表的增,删,改 操作均由服务器自动激活相应的触发器,在DBMS 核心层进行集中的完整性控制.触发器类似于约束, 但是比约束更加灵活,可实施比FOREIGN KEY约 束,CHECK约束更为复杂的检查和操作,具有更 精细和更强大的数据控制能力.
定义触发器(续)
当你创建一个触发操作时,通常需说明所指的是触发语句 作用之前还是之后的列值.由于此种原因,我们用两个取 有特殊名字的虚拟表格来测试触发语句的作用:deleted 和inserted(在内存中,触发器完成运行后,这些表就不 能再访问). 这些表和指定触发器的表具有相同的结构. deleted表保 存受delete和update影响的行的副本.inserted表保存在 insert和update之后添加到触发器中的行的副本.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1)实体完整性 )
实体(Entity):是数据逻辑模型中的一个概念。现实世界是一 组实体的基本对象和这些对象的联系(Relation)构成的。在 数据库中,我们可以理解一条记录就是一个实体。 实体完整性:在现实世界中,任何一个实体都有区别于其他实 任何一个实体都有区别于其他实 体的特征,即在数据库中,所有的记录都应该有惟一的标识, 体的特征 这就是实体完整性的含义(规则2.1:实体完整性规则)。
例1:删除 :删除student中的主键约束和惟一值约束 中的主键约束和惟一值约束
ALTER TABLE student Drop constraint sno_pk,sname_uk
查看主键约束的定义文本 EXEC sp_helptext <constraint_name> 查看表中主键约束 EXEC sp_helpconstraint <table_name> 查看数据库中所有主键约束 SELECT name from sysobjects WHERE type=‘K‘ 备注: K:primary key或unique约束;F:foreign key C:check约束;D:默认值;R:规则;TR:触发器; U:用户表; V:视图
字段创建主键约束, 例1:定义数据表 :定义数据表student时,为学号 时 为学号sno字段创建主键约束,对 字段创建主键约束 姓名sname字段定义惟一值约束; 字段定义惟一值约束; 姓名 字段定义惟一值约束 方法1:在列级定义主码 Use stu
CREATE TABLE student (Sno char(9) constraint sno_pk primary key, Sname char(8) constraint sname_uk unique, Ssex char(2) , Sage smallint , Sdept varchar(20))
创建及管理约束及约束对象 默认值约束及默认值对象 创建及管理规则对象
1、创建及管理约束及约束对象 、
主键Primary key约束 惟一值Unique约束 外键Foreign key约束 检查Check约束
1)创建及删除主键约束及惟一值约束 )
单属性构成的码的两种说明方法 :
定义为列级约束条件,定义为表级约束条件
默认策略
2. 级联(CASCADE)操作 3. 设置为空值(SET-NULL)
对于参照完整性,除了应该定义外码,还应定义外码列是否允 许空值
i)创建表时同时定义Foreign key约束 语法格式:
CREATE TABLE table_name (column_name data_type [FOREIGN KEY] REFERNCES ref_table(ref_column) [ on delete {CASCADE | no action}] --cascade表示主从表删除时一致,进行级联删除 --no action 表示回滚主表的删除操作,为默认设置 [ on update {CASCADE | no action}] [, ...n] ) --主从表更新时一致 --n表示可定义多个字段
可能破坏参照完整性的情况及违约处理
被参照表(例如Student) 可能破坏参照完整性 可能破坏参照完整性 删除元组 修改主码值
参照表(例如SC) 插入元组 修改外码值 可能破坏参照完整性 可能破坏参照完整性
违约处理 拒绝 拒绝 拒绝/级连删除/设置为空值 拒绝/级连修改/设置为空值
当主码外码发生不一致时,系统可采取以下策略: 1. 拒绝(NO ACTION)执行
方法2:在表级定义主码 CREATE TABLE Student (Sno CHAR(9) , Sname CHAR(20) , Ssex CHAR(2) , Sage SMALLINT, Sdept CHAR(20), PRIMARY KEY (Sno) )
实体完整性检查:
插入或对主码列进行更新操作时,RDBMS按照实体完整性规则自 动进行检查。包括: 1. 检查主码值是否唯一,如果不唯一则拒绝插入或修改 2. 检查主码的各个属性是否为空,只要有一个为空就拒绝插 入或修改
2)创建及管理外键约束 )
对于两个相关联的表(主表与从表)进行数据插入和删除时, 通过参照完整性保证他们之间数据的一致性。 利用Foreign Key定义从表的外码,Primary Key或者Unique定 义主表中的主码或惟一码(不允许为空),可实现主表与从表 之间的参照完整性。 定义表间参照关系:先定义主表主码(或惟一码),再对从表 定义外码约束。
第五章 数据库完整性
授课教师:王哲
数据库完整性
数据是数据库的核心,数据的正确和完整与否将直接影响数据 库的使用。 数据的完整性 安全性 完整性和安全性 完整性 安全性是两个不同概念;
数据的安全性
保护数据库防止恶意的破坏和非法的存取 防范对象:非法用户和非法操作
数据的完整性
防止数据库中存在不符合语义的数据,也就是防止数据库中存在不正 确的数据 防范对象:不合语义的、不正确的数据
参照完整性的常见实现机制包括:
外键(Foreign Key)、检查(Check)、触发器(Trigger);存 储过程(Stored Procedure)
在输入或删除记录时,可以用来保持所有表之间定义的关 系,以确保键值在所有表中一致。 关系模型的参照完整性定义
在CREATE TABLE中用FOREIGN KEY短语定义哪些列为 外码 用REFERENCES短语指明这些外码参照哪些表的主码
(column [,...n])
学号sno字段添加主键约束,对学生姓名 字段添加主键约束, 例1:对数据表 :对数据表student学号 学号 字段添加主键约束 添加惟一值约束; 添加惟一值约束; Alter table student Add constraint sno_pk primary key sno
中创建主表student和course,主键分别为 例1:在数据库 :在数据库stu中创建主表 中创建主表 和 , sno和cno,创建从表 ,sc.sno为外码,与数据表 为外码, 和 ,创建从表sc, 为外码 与数据表student 主键对应,当对主表进行更新或删除操作时, 主键对应,当对主表进行更新或删除操作时,对从表采用级联 操作; 为外码, 主键对应, 操作;o为外码,与数据表 为外码 与数据表course主键对应,当对主表 主键对应 进行更新或删除操作时,对从表采用NO Action方式。 进行更新或删除操作时,对从表采用 方式。 方式 Use stu Create table student(sno char(9) primary key,sname……) Create table course (cno char(4) primary key,sname……) Create table sc (sno char(9) foreign key references student(sno) on delete cascade on update cascade, cno char(4) foreign key references course(cno) on delete no action on update no action , Grade smallint )
3)域完整性 )
域:指列(字段),所以域完整性就是指列的完整性; 域完整性要求列(字段)的数据具有正确的数据类型、格式和 有效的数值范围。 域完整性的常见实现机制包括:
默认值(Default) 检查(Check) 数据类型(Data type) 规则(Rule)
4)用户自定义完整性 )
用户定义的完整性就是针对某一具体应用的数据必须满 足的语义要求;可直接由RDBMS提供,而不必由应用程 序承担;系统将实现数据完整性的要求直接定义在表上 或列上。 常见的实现机制包括:
ii)通过修改表定义Foreign key约束 语法格式:
ALTER TABLE table_name ADD [constraint constraint_name] [FOREIGN KEY] (column[,…n]) REFERNCES ref_table(ref_column [,…n]) [ on delete {CASCADE | no action}] [ on update {CASCADE | no action}]
检查方法:全表扫描、索引
ii)通过修改表时同时创建primary key约束或 )通过修改表时同时创建 约束或unique约束 约束或 约束 语法格式:
ALTER TABLE table_name ADD [CONSTRAINT constraint_name]
primary key | unique
Alter table student Add constraint sname_uk unique sname
删除primary key约束或 约束或unique约束 删除 约束或 约束 语法格式:
ALTER TABLE table_name DROP CONSTRAINT constraint_name [, ...n]
为主表, 例1:假设数据库 :假设数据库stu中student和course为主表,主键分别为 中 和 为主表 sno和cno, sc为从表,将sc.sno定义为外码。 为从表, 定义为外码。 和 , 为从表 定义为外码 Use stu Alter table sc ADD constraint sc_fk foreign key sno references student(sno)
规则(Rule)、创建数据表时的所有约束(Constraint)、触发 器(Trigger)、存储过程(Stored Produre);
二、在SQL Server 2005中实现数据完整性 中实现数据完整性