第 6讲索引、约束与数据库其它对象索引
问题如何提高查询速度?
某些列如何保证没有重复值或满足一定条件?
如何保证数据的参照完整性?
概念:
索引是一个表中所包含的值以及相应的存储位置的列表
分类:
聚集索引
非聚集索引
复合索引
唯一索引何时使用索引
在那些经常被用来查询的列上建立索引,以提高查找效率
【 例子 】 在 Student表中可以分别建立基于学号、姓名的索引
索引将占用磁盘空间,并且降低添加、删除和更新行的速度,
所以要慎用!
创建索引
使用企业管理器
【 问题 】 在 Student表上创建基于
StuName列,名为 IX_StuName的非聚集、非唯一索引
注意:创建主键约束何唯一约束时,会自动在这些列上创建唯一索引创建索引



使用 SQL语句
【 问题 】 在表 course中的课程名称列上建立唯一索引
【 练习 】 使用 SQL语句在 StuCou表上创建名为 IX_StuNoCouNo的聚集、
唯一、复合索引,该索引基于
StuNo列和 CouNo列创建复合索引说明
在(字段 1,字段 2)上创建的复合索引和在(字段 2,字段 1)
上创建的复合索引是不同的
查找数据时,只有在 where子句中指定了索引的第一个字段时才使用该复合索引
复合索引中字段的顺序很重要:
在次序上首先定义最具唯一性的字段列删除索引
使用企业管理器
使用 SQL语句格式:
DROP INDEX table_name.index_name
【 问题 】 删除 StuCou表中的
IX_StuNoCouNo索引思考,student表中的索引
PK_Student可以删除吗?
管理索引
显示索引信息
sp_helpindex table_name
重命名索引
sp_rename
table_name.old_index_name,
new_index_name
使用企业管理器索引分析
索引分析显示在查询时索引使用情况:
set showplan_all on|off
例:在 stucou的 couno上建索引,然后执行一个查询,并分析索引。
约束概述约束的作用:保证了数据的完整性
提问:数据完整性有几类?
约束的种类:
课本 P166
UN
IQ
UE
约束
UNIQUE约束要求字段的值不能重复,同时允许字段的值为空
【 问题 】 为 Student表创建基于
Pwd列,名为 UQ_Student的唯一约束
说明:一个表格可以创建多个
UNIQUE约束,它主要用于不是主键但又要求不能有重复值的字段
DE
FA
UL
T
约束
如果用户没有为定义了
DEFAULT约束的字段输入数据,则由该约束提供默认的数据(避免空值的有效方法之一)
【 问题 】 为 StuCou表的 State字段建立 DEFAULT约束,提供
“报名”的默认值
说明:一个字段只能建立一个
DEFAULT约束
Ch
ec
k
约束
限制表的某些字段满足一定条件
【 问题 】 要求 course表的字段 couno
的值只允许三位数字主键约束
主键约束某列或几个列的组合,其值能唯一标识表中一行 。
【 问题 】 在表 course字段 CouNo上设置主键外键约束
外键约束建立两个表之间的联系
【 问题 】 要保证 class表中的系代码在表 Department中存在,请创建外键删除约束
格式:
Alter Table table_name
DROP CONSTRAINT constraint_name
默认值
(de
fau
lt

默认值是一种独立存储的数据库对象,其作用和默认约束是一样的。在创建之后,可以用到表中的一列或多列上,也可以用到用户自定义的数据类型。
实现方法
先创建( create default),再绑定( sp_bindefault)到列或用户自定义数据类型
【 问题 】 创建一个默认 d_bm,默认值为 ’ 报名 ’ 。然后绑定到表
StuCou的列 state。
思考:这里的默认值和我们第 7
章讲的默认约束有什么异同?
默认值



删除方法
先解除绑定( sp_unbindefault),
再删除规则
(ru
le


自学

注意:
先创建规则,再绑定到列或用户自定义数据类型上
先解除绑定,再删除规则
【 练习 】 创建规则 r_crt,内容是限制值在 1~5之间。然后绑定到表
Course的列 Credit上,使学分限制在 1到 5之间 。
思考:
规则和第 7章讲的 CHECK约束的区别用户自定义函数
(fu
nc
tio
n

创建方法:
【 问题 】 创建一函数,求两个数之差
使用方法:
【 问题 】 为 Course增加一列
RemainNum,使用前面定义的函数与其绑定小结
理解:各种索引、约束分别用在什么情况下
重点:掌握创建各种索引和约束的方法
默认值
规则
用户自定义函数
注意:这些都是数据库的对象,
而不属于某个表格(不同于约束和索引)