1、2022-5-291第五章 教学要求理解数据库完整性控制的基本概念与方法。掌握SQL Server2005定义完整性约束的方法。2022-5-292第五章 教学重点数据库完整性控制的基本概念与方法。SQL Server2005定义完整性约束的方法。2022-5-293第五章 教学难点数据库完整性控制的基本概念与方法。SQL Server2005定义完整性约束的方法。2022-5-294第五章 教学内容 完整性约束条件 SQL Server2005中对数据完整性控制2022-5-295创建、删除和修改约束 在SQL Server 2005中有5种约束:主键约束(primary key const
2、raint)唯一性约束(unique constraint)检查约束(check constraint)缺省约束(default constraint)外部键约束(foreign key constraint)2022-5-2961. 主键约束 主键的添加、删除和修改操作方法有两种:主键的添加、删除和修改操作方法有两种:(一)(一)Management Studio 操作法,在操作法,在Management Studio 中,用右键单击要操作中,用右键单击要操作的数据库表,从弹出的快捷菜单中选择的数据库表,从弹出的快捷菜单中选择“修改修改”选项,然后根据图示操作选项,然后根据图示操作 。(二)
3、(二)Transact-SQL语句操作法。语句操作法。 其语法形式如下:其语法形式如下:CONSTRAINT constraint_name PRIMARY KEY CLUSTERED|NONCLUSTERED (column_name,n)2022-5-2972022-5-2982022-5-2992022-5-29102022-5-2911按下shift键再用鼠标同时选中鼠标左键选中即可设置主键约束2022-5-2912返回返回2022-5-29132022-5-2914主键约束各参数的说明如下 constraint_name:用于指定约束的名称,:用于指定约束的名称,约束的名称在数据库中
4、应该是唯一的。如果约束的名称在数据库中应该是唯一的。如果不指定,则系统会自动生成一个约束名。不指定,则系统会自动生成一个约束名。CLUSTERED|NONCLUSTERED:用于指:用于指定索引的类型,即聚簇索引或者非聚簇索引,定索引的类型,即聚簇索引或者非聚簇索引,CLUSTERED为默认值。为默认值。column_name:用于指定主键的列名。主:用于指定主键的列名。主键最多由键最多由16个列组成。个列组成。2022-5-2915例子在执行创建产品信息表的操作时,指定产品编号为在执行创建产品信息表的操作时,指定产品编号为主键值,并且创建一个聚簇索引。主键值,并且创建一个聚簇索引。creat
5、e table products(id char(10) not null,name char(20) not null,price money default 0.01,quantity smallint null,constraint pk_id primary key clustered (id)2022-5-29162. 唯一性约束唯一性约束用于指定一个或者多个列的组合的值唯一性约束用于指定一个或者多个列的组合的值具有唯一性,以防止在列中输入重复的值。当使具有唯一性,以防止在列中输入重复的值。当使用唯一性约束时,需要考虑以下几个因素:用唯一性约束时,需要考虑以下几个因素: 使用唯一性约
6、束的字段允许为空值。使用唯一性约束的字段允许为空值。一个表中可以允许有多个唯一性约束。一个表中可以允许有多个唯一性约束。可以把唯一性约束定义在多个字段上。可以把唯一性约束定义在多个字段上。唯一性约束用于强制在指定字段上创建一个唯唯一性约束用于强制在指定字段上创建一个唯一性索引。一性索引。 缺省情况下,创建的索引类型为非聚簇索引。缺省情况下,创建的索引类型为非聚簇索引。2022-5-2917创建和修改唯一性约束的操作方法创建和修改唯一性约束的操作方法有两种:创建和修改唯一性约束的操作方法有两种:(一)(一)Management Studio 操作法,通过操作法,通过Management Stud
7、io 可以完成创建和修改唯可以完成创建和修改唯一性约束的操作。一性约束的操作。 (二)(二)Transact-SQL语句操作法。语句操作法。CONSTRAINT constraint_name UNIQUE CLUSTERED|NONCLUSTERED(column_name,n)下一页下一页2022-5-2918此处可以创建唯一性约束2022-5-29192022-5-29202022-5-29213. 检查约束 一个列级检查约束只能与限制的字段有关;一一个列级检查约束只能与限制的字段有关;一个表级检查约束只能与限制的表中字段有关。个表级检查约束只能与限制的表中字段有关。一个表中可以定义多个
8、检查约束。一个表中可以定义多个检查约束。每个每个CREATE TABLE语句中每个字段只能定义语句中每个字段只能定义一个检查约束。一个检查约束。在多个字段上定义检查约束,则必须将检查约在多个字段上定义检查约束,则必须将检查约束定义为表级约束。束定义为表级约束。当执行当执行INSERT语句或者语句或者UPDATE语句时,检查语句时,检查约束将验证数据。约束将验证数据。检查约束中不能包含子查询。检查约束中不能包含子查询。2022-5-2922创建检查约束常用的操作方法有两种创建检查约束常用的操作方法有两种1.Management Studio 操作法。使用操作法。使用Management Stud
9、io 创建检查约束,根据图创建检查约束,根据图示进行操作。示进行操作。2.Transact-SQL语句操作法。检查约束的语句操作法。检查约束的Transact-SQL语句操作法,其语法形式如下:语句操作法,其语法形式如下:CONSTRAINT constraint_name CHECK NOT FOR REPLICATION (logical_expression)2022-5-29232022-5-29242022-5-29252022-5-2926例子创建了一个学生信息表,其中输入性别字段值时,只能创建了一个学生信息表,其中输入性别字段值时,只能接受接受“F”或者或者“M” 。create
10、 table student( Id char(8), name char(8), sex char(2), phonenum int, constraint chk_sex check(sex in (F,M) )2022-5-29274. 缺省约束 使用缺省约束时,应该注意以下几点:使用缺省约束时,应该注意以下几点:每个字段只能定义一个缺省约束。每个字段只能定义一个缺省约束。如果定义的缺省值长于其对应字段的允许长度,如果定义的缺省值长于其对应字段的允许长度,那么输入到表中的缺省值将被截断。那么输入到表中的缺省值将被截断。不能加入到带有不能加入到带有IDENTITY属性或者数据类型属性或者数
11、据类型为为timestamp的字段上。的字段上。如果字段定义为用户定义的数据类型,而且有如果字段定义为用户定义的数据类型,而且有一个缺省绑定到这个数据类型上,则不允许该一个缺省绑定到这个数据类型上,则不允许该字段有缺省约束。字段有缺省约束。2022-5-2928例子创建了一个学生信息表,其中输入性别字段值时,创建了一个学生信息表,其中输入性别字段值时,只能接受只能接受“F”或者或者“M”,并且缺省设置,并且缺省设置sex为为“M”。create table student( Id char(8), name char(8), sex char(2) default m, phonenum in
12、t, constraint chk_sex check (sex in (F,M)2022-5-29292022-5-29305. 外部键约束外部键约束用于强制参照完整性,提供单个外部键约束用于强制参照完整性,提供单个字段或者多个字段的参照完整性。当使用外部字段或者多个字段的参照完整性。当使用外部键约束时,应该考虑以下几个因素:键约束时,应该考虑以下几个因素: 外部键约束提供了字段参照完整性。外部键约束提供了字段参照完整性。 外部键从句中的字段数目和每个字段指定外部键从句中的字段数目和每个字段指定的数据类型必须和的数据类型必须和REFERENCES从句中的字从句中的字段相匹配。段相匹配。 外部
13、键约束不能自动创建索引,需要用户外部键约束不能自动创建索引,需要用户手动创建。手动创建。2022-5-2931 用户想要修改外部键约束的数据,必须有用户想要修改外部键约束的数据,必须有对外部键约束所参考表的对外部键约束所参考表的SELECT权限或者权限或者REFERENCES权限。权限。 参考同一表中的字段时,必须只使用参考同一表中的字段时,必须只使用REFERENCES子句,不能使用外部键子句。子句,不能使用外部键子句。 一个表中最多可以有一个表中最多可以有31个外部键约束。个外部键约束。 在临时表中,不能使用外部键约束。在临时表中,不能使用外部键约束。 主键和外部键的数据类型必须严格匹配。
14、主键和外部键的数据类型必须严格匹配。2022-5-2932例: 给SC表添加这样一个约束,使用户输入的学生学号必须要在Student表中的sno列中出现过的学生学号。 alter table sc add constraint ref_stu_sno foreign key (sno) references student(sno)下一页2022-5-2933演示过程建立检查约束2022-5-2934演示过程建立检查约束2022-5-2935演示过程建立检查约束2022-5-2936演示过程建立默认值约束2022-5-2937演示过程建立默认值约束2022-5-2938演示过程建立检查约束20
15、22-5-2939演示过程建立检查约束2022-5-2940演示过程-建立外键约束2022-5-2941演示过程建立外键约束2022-5-2942演示过程检查外键约束2022-5-2943演示过程检查外键约束2022-5-2944演示过程删除外键约束2022-5-2945索引操作创建索引 查看、修改和删除索引2022-5-2946一、什么叫索引 数据库中的索引与书籍中的索引类似,在一数据库中的索引与书籍中的索引类似,在一本书中,利用索引可以快速查找所需信息,无本书中,利用索引可以快速查找所需信息,无须阅读整本书。在数据库中,索引使数据库程须阅读整本书。在数据库中,索引使数据库程序无须对整个表进
16、行扫描,就可以在其中找到序无须对整个表进行扫描,就可以在其中找到所需数据。书中的索引是一个词语列表,其中所需数据。书中的索引是一个词语列表,其中注明了包含各个词的页码。而数据库中的索引注明了包含各个词的页码。而数据库中的索引是某个表中一列或者若干列值的集合和相应的是某个表中一列或者若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针指向表中物理标识这些值的数据页的逻辑指针清单。清单。 2022-5-2947二、索引的作用二、索引的作用通过创建唯一索引,可以保证数据记录的唯一性。通过创建唯一索引,可以保证数据记录的唯一性。可以大大加快数据检索速度。可以大大加快数据检索速度。可以加速表与
17、表之间的连接,这一点在实现数据可以加速表与表之间的连接,这一点在实现数据的参照完整性方面有特别的意义。的参照完整性方面有特别的意义。在使用在使用ORDER BY和和GROUP BY子句中进行检子句中进行检索数据时,可以显著减少查询中分组和排序的时索数据时,可以显著减少查询中分组和排序的时间。间。使用索引可以在检索数据的过程中使用优化隐藏使用索引可以在检索数据的过程中使用优化隐藏器,提高系统性能。器,提高系统性能。 2022-5-2948聚集索引与非聚集索引聚集索引与非聚集索引聚集索引对表的物理数据页中的数据按列进聚集索引对表的物理数据页中的数据按列进行排序,然后再重新存储到磁盘上,即聚集索行排
18、序,然后再重新存储到磁盘上,即聚集索引与数据是混为一体的,它的叶节点中存储的引与数据是混为一体的,它的叶节点中存储的是实际的数据。是实际的数据。 非聚集索引具有完全独立于数据行的结构,非聚集索引具有完全独立于数据行的结构,使用非聚集索引不用将物理数据页中的数据按使用非聚集索引不用将物理数据页中的数据按列排序。非聚集索引的叶节点存储了组成非聚列排序。非聚集索引的叶节点存储了组成非聚集索引的关键字值和行定位器。集索引的关键字值和行定位器。 返回返回2022-5-2949创建索引 SQL Server 2005创建索引的方法创建索引的方法(1)利用对象资源管理器直接创建索)利用对象资源管理器直接创建
19、索引。引。(3)利用)利用Transact-SQL语句中的语句中的CREATE INDEX命令创建索引。命令创建索引。2022-5-2950利用对象资源管理器直接创建索引利用对象资源管理器直接创建索引其具体步骤如下:其具体步骤如下:()在对象资源管理器中,展开指定的服()在对象资源管理器中,展开指定的服务器、数据库,展开要创建索引的表,用右键单务器、数据库,展开要创建索引的表,用右键单击击“索引索引”,从弹出的快捷菜单中选择,从弹出的快捷菜单中选择“新建索新建索引引”选项,点击,则出现新建索引对话框。选项,点击,则出现新建索引对话框。 (2)填写索引名称,选择索引类型,添加)填写索引名称,选择
20、索引类型,添加建立索引的属性列,选择完成后单击建立索引的属性列,选择完成后单击“确定确定”按按钮,即可生成新的索引;单击钮,即可生成新的索引;单击“取消取消”按钮,则按钮,则取消新建索引的操作。取消新建索引的操作。2022-5-29512022-5-29522022-5-2953利用利用Transact-SQL语句中的语句中的CREATE INDEX命令创建索引。命令创建索引。 CREATE INDEX au_id_ind ON authors (au_id) CREATE INDEX emp_order_ind ON order_emp (orderID, employeeID) 2022-5-2954小结数据库完整性控制的基本概念与方法。SQL Server2005定义完整性约束的方法。2022-5-2955思考题 如何在SQL Server2005定义完整性约束的方法?