第4章实现数据完整性本章概述保证数据库中的数据遵循范式的同时不会在数据的添加删除和修改等操作中产生矛盾或者缺失,是数据库程序员的一项重要任务。
本章介绍了数据完整性的概念,包括可用于强制数据完整性的方法。
本章重点介绍了确保数据完整性的主要方法——约束,并介绍了各种约束类型。
本章还详细讨论了如何创建和实现约束以及在必要时禁用约束的方法。
同时,本章还讨论了默认值和规则,并概括了几种不同方法的比较。
学习完本章后,学生能够理解数据完整性的重要性,并可以通过各种手段保证企业数据完整。
教学目标●了解数据完整性类型●掌握强制数据完整性的方法●掌握如何确定使用哪种约束并创建该约束●了解定义和使用DEFAULT、CHECK、PRIMARY KEY、UNIQUE和FOREIGN KEY约束●掌握禁用约束检查●了解及使用默认值和规则●掌握确定使用哪种方法保证数据完整性教学重点●数据完整性的概念,考试中也经常出现概念题。
●约束的类型,以及何时使用何种约束的原则。
●创建和使用约束。
教学难点●数据完整性概念,如何同企业场景结合起来。
●不同约束类型的比较。
●何时使用哪种保证数据完整性的强制方法。
数据库程序设计—SQL Server 2000 数据库程序设计教师参考手册教学资源2第4章实现数据完整性先修知识在正式开始学习本章内容以前,学生须具备下列知识基础。
建议学时课堂教学(4课时)+实验教学(3课时)教学过程4.1数据完整性的类型教学提示:本节主要达到一个目的。
●掌握数据完整性的3种类型:域完整性、实体完整性和引用完整性。
保证了数据完整性,才能使企业数据库在应用中更加健壮。
(略讲)3数据库程序设计—SQL Server 2000 数据库程序设计教师参考手册4.2强制数据完整性教学提示:本节主要达到一个目的。
●了解保证数据完整性的两种途径:通过声明和通过代码。
这两种方法企业中被广泛应用。
(略讲)4第4章实现数据完整性4.3定义约束教学提示:本节主要达到三个目的。
●了解各种约束在不同场合的作用,如何根据企业场景选择约束。
(略讲)●掌握创建约束的方法。
(精讲+演示)●了解使用约束的注意事项。
(略讲)5数据库程序设计—SQL Server 2000 数据库程序设计教师参考手册4.4约束的类型教学提示:本节主要达到两个目的。
●掌握约束的类型,定义约束的语法。
(精讲+演示)●掌握各种约束的区别和应用场景。
(精讲)6第4章实现数据完整性7数据库程序设计—SQL Server 2000 数据库程序设计教师参考手册8第4章实现数据完整性9数据库程序设计—SQL Server 2000 数据库程序设计教师参考手册10114.5禁用约束4.6使用默认值和规则124.7决定使用何种强制方法4.8推荐操作总结经过本章的学习,我们了解了下列的知识和内容。
●数据完整性类型●强制数据完整性的方法●如何确定使用哪种约束并创建该约束●定义和使用DEFAULT、CHECK、PRIMARY KEY、UNIQUE和FOREIGN KEY约束●禁用约束检查●使用默认值和规则●确定使用哪种方法保证数据完整性13在前面四章的学习中,我们已经大量用到了SQL语句对数据库对象进行操作。
下面一章中,我们将详细学习Transact-SQL语言。
随堂练习1.在一个SQL Server 2000中创建一个医院管理系统中的护士(Nurses)和病人(Patients)两个数据表,一个护士可以照看多个病人,而一个病人必须由两个护士共同负责。
在下列四个选项中SQL语句选出正确的选项。
A.CREATE TABLE Nurses{NursesID int NOT NULL PK_Nurses PRIMARY KEY CLUSTERED,Name varchar(20) NOT NULL,}GOCREATE TABLE Patients{PatientsID int NOT NULL PK_Nurses PRIMARY KEY CLUSTERED,Name varchar(20) NOT NULL,NurseID1 int NOT NULL,NurseID2 int NOT NULL}B.CREATE TABLE Nurses{NursesID int NOT NULL PK_Nurses PRIMARY KEY CLUSTERED,Name varchar(20) NOT NULL,}GOCREATE TABLE Patients{PatientsID int NOT NULL PK_Nurses PRIMARY KEY CLUSTERED,Name varchar(20) NOT NULL,14NurseID1 int NOT NULL FOREIGN KEY(NuresesID) reference Nureses,NurseID2 int NOT NULL FOREIGN KEY(NuresesID) reference Nureses }C.CREATE TABLE Nurses{NursesID int NOT NULL PK_Nurses PRIMARY KEY CLUSTERED,Name varchar(20) NOT NULL,}GOCREATE TABLE Patients{PatientsID int NOT NULL PK_Nurses PRIMARY KEY CLUSTERED,Name varchar(20) NOT NULL,NurseID1 int NOT NULL FOREIGN KEY(NuresesID) reference Nureses,NurseID2 int NOT NULL FOREIGN KEY(NuresesID) reference Nureses }GOCREATE TABLE PatientsNurses{PatientNurseID int NOT NULL CONSTRAINT PK_PatientsNurses PRIMARY KEY CLUSTED,NursesID int NOT NULL,PatientID int NOT NULL}D.CREATE TABLE Nurses{NursesID int NOT NULL PK_Nurses PRIMARY KEY CLUSTERED,Name varchar(20) NOT NULL,}15GOCREATE TABLE Patients{PatientsID int NOT NULL PK_Nurses PRIMARY KEY CLUSTERED,Name varchar(20) NOT NULL,}GOCREATE TABLE PatientsNurses{PatientID int NOT NULL REFERENCES Patients(PatientID),NurseID int NOT NULL REFERENCES Nurses(NursesID),CONSTRAINT PK_PatientsNurses PRIMARY KEY(PatientID,NurseID) }正确答案:(D)2.下图为某订购系统中的数据字典结构:请问应当使用何种方式将数据冗余减到最低?A.删除OrderDetails中的CustomerID列16B.使用OrderID和ProductID作为联合主键C.在OrderID列使用索引D.在OrderID列上添加UNIQUE属性正确答案:(A)分析:高效的数据库设计要求规范化数据库。
通过检查数据字典设计,我们发现OrderDetails 中的CustomerID列设计不正确。
CustomerID列属于Customer表,Orders表引用CustomerID列作为外键约束。
将OrderDetails表中的CustomerID列删除可以规范化数据库设计,降低数据冗余和提高性能。
3.在一个网络招聘网站的数据库中有一张记录申请者职业技能的数据表。
表结构如下图所示:应当将标中的哪一列设为主键?A.CandidateIDB.CandidateID和DateLastUsedC.CandidateID和SkillIDD.CandidateID,SKillID和DateLastUsed正确答案:(C)分析:主键约束保证了输入的数据不能为空且保证数据的唯一性。
当主键包含多列时就允许其中的一列的数据内容重复,但是所有主键列的数据组合必须唯一。
在本题中,我们需要创建主键约束来区分不同申请者的不同职业技能。
就必须包含CandidateID和SkillID两列数据作为复合主键。
4.在医院的数据库管理系统中,记录有新生婴儿的信息,使用下面的脚本语句创建一个名为Infants数据库:CREATE TABLE[dbo].[Infants](17[InfantID] [int] NOT NULL,[DateofBirth] [datetime] NOT NULL,[WeightAtBirth] [decimal](5.2) NOT NULL,[MotherID] [int] NOT NULL,[FatherID] [int] NOT NULL) ON [PRIMARY]GOALTER TABLE [dbo].[Infants] WITH NOCHECK ADDCONSTRAINT [PK_Infants]PRIMARY KEY CLUSTERED([InfantID]) ON [PRIMARY]GO如果要确保MotherID和FatherID的正确性,要求将磁盘I/O最小化,应当采用何种方法?A.使用插入触发器检验数据B.使用CHECK约束C.使用外键约束,MotherID和FatherID参照身份证数据库中的IDD.创建规则绑定列MotherID和FatherID正确答案:(C)分析:从数据库的逻辑设计中我们可以看到InfantID列和MotherID与FatherID的关系是一对多的关系:每个婴儿有一对父母,而一对父母有一个或多个孩子。
一对多在SQL Server 等关系型数据库中使用外键约束来实现。
在MotherID和FatherID上建立外键约束可以保证输入数据的参考完整性。
5.在图书馆系统中的数据表Records记录会员借阅图书的信息,假设每个会员可以借阅多本图书,而一个会员不能借阅两本相同的图书。
如果要达到上述设计要求,下列哪种做法最为合理?A.将RecordID和会员ID和图书ID设为联合主键B.在RecordID和会员ID和图书ID列上添加UNIQUE约束18C.在RecordID和会员ID和图书ID列上使用CHECK约束保证D.在RecordID和会员ID和图书ID列上创建索引正确答案:(B)分析:UNIQUE约束保证了一系列列数据的唯一性并保证输入某列的数据不能重复,而这些列不是主键的一部分。