龙源期刊网 http://www.qikan.com.cn
SQL2005中约束和索引的作用与联系
作者:徐景秀 熊金猛
来源:《中国高新技术企业》2014年第18期
摘要:文章从约束和索引的作用及它们之间的相互联系观点出发,概述了约束的功能及概念,索引的功能及概念,与索引相联系的两种约束。在实例数据库sale中的customer表、product表和proin表上创建约束和索引,引证提出的观点创建约束与索引的联系与作用、删除约束与索引的联系与作用及创建索引与删除索引对约束的影响等。 关键词:约束和索引;联系作用;约束影响
中图分类号:TP311 文献标识码:A 文章编号:1009-2374(2014)27-0045-02 1 约束的功能及概念
约束定义了数据的有效性规则,其目的在于防止数据库中出现不正确或不一致的数据,可以自动维护并保存数据库中的数据完整性。约束是SQL Server提供的自动强制数据完整性的一种方式,它是通过定义列的取值规则来维护数据的完整性,约束定义关于列中允许值的规则,是强制完整性的标准机制。使用约束优先于使用触发器、规则和默认值。查询分析器也使用约束定义生成高性能的查询执行计划。 2 索引的功能及概念
索引是通过数据行表中的索引关键值来指向表中的数据行,这样数据库引擎不用扫描整个表就能快速定位到所需要的数据行。相反,如果没有索引则会导致SQL Server搜索表中所有的数据行难以找到匹配结果。可以在表或视图的一列或多列上创建索引,基于两列或多列上建立的索引称为复合索引;如果表中任意两行被索引的列值不允许出现重复值,那么这种索引称为惟一索引。索引主要分为两种,即聚集索引和非聚集索引。 3 与索引有联系的主要约束
与索引有联系的主要约束有以下两种:
PRIMARY KEY约束:主键约束标识列或列集,它可用来强制数据的完整性,在数据表中主键只能有一个,主键可以是一列,也可以是由多列所组成的主键,并且主键约束不允许在创建主键的列上有空值。
UNIQUE(惟一)约束:惟一约束在列集内强制执行值的惟一性,即在列中不允许有相同的值。但是惟一约束允许在创建惟一索引的列上有空值。
龙源期刊网 http://www.qikan.com.cn
以下所讨论的论点均用销售数据库实例sale来论证说明。 4 约束与索引的联系与作用 4.1 创建约束与索引的联系与作用
4.1.1 主键约束的创建与聚集索引的联系与作用。用户在数据库表中(该表目前没有聚集索引)创建主键约束时,SQL Server将自动在建有这些约束的列上创建对应的聚集索引;若该表已经创建了聚集索引,则再为之创建主键约束,SQL Server将自动在建有这些约束的列上创建惟一非聚集索引。下面在销售数据库sale中的customer表(无聚集索引)上的Cusno列创建主键p1,在proin表(已有聚集索引i1)上创建主键约束PK_proin进行论证说明。 alter table customeradd constraint p1 primary key(CusNo)
Alter table prion add constraint PK_proin primary key(inputdate,prono)
执行代码后,customer表添加了主键p1,再观察customer表上的索引,可以看出系统同时自动为它创建了一个与主键同名p1的聚集索引,若proin表上已有聚集索引时,再创建主键约束PK_proin,SQL Server将自动在建有这些约束的列上创建同名的惟一非聚集索引PK_proin。
由关系数据库表设计的要求,每张关系表必须设计一个主键约束,很多时候聚集索引由系统自动创建并与主键同名,即数据行按照主键列值物理排序,用户不用单独创建设置。 4.1.2 创建惟一约束与惟一索引的联系与作用。用户在数据库表中创建惟一约束时,SQL Server将自动在建有这些约束的列上创建对应的惟一索引,下面在销售数据库sale中的product表上的proname列创建惟一约束进行论证说明。 alter table product add constraint u1 unique(proname)
执行代码后,product表添加了惟一约束,再观察product表上的索引,系统同时自动为它创建了一个与惟一约束同名u1的惟一索引。
在SQL Server系统中,创建惟一约束的目的是确保在列中不输入重复值保证一列或多列的实体完整性;而在创建每个UNIQUE约束时系统自动创建一个惟一索引;SQL Server允许为一个表创建多个UNIQUE约束的同时产生多个UNIQUE索引。 4.2 删除约束与索引的联系与作用
用户创建了主键约束、惟一约束或某个索引后,若觉得不合适想要作删除操作,其结果又是怎样,它们之间的操作是有联系还是相互独立的呢?
龙源期刊网 http://www.qikan.com.cn
如果是创建主键约束时系统自动创建的聚集索引作删除操作,现删除上例sale数据库中Cusno列主键p1,proname列上的惟一约束u1。 Alter table customer Drop constraint p1 Alter table product Drop constraint u1
执行上面代码,customer表和product表删除了主键约束p1和惟一约束u1,同时customer表和product表中的索引也没有了。由此可得出:通过修改表添加约束时创建的主键约束p1或惟一约束u1,使用修改表删除主键约束p1或惟一约束u1,都会使主键约束p1及聚集索引p1或惟一约束u1及惟一索引u1同时删除。 4.3 创建索引与删除索引对约束的影响
在SQL Server中,创建索引操作,对约束没有任何影响。现在customer表和product表中分别创建聚集索引c1和u1。
create clustered index c1 on customer(CusNo) create unique index u1 on product(proname)
在SQL Server中,只能删除由创建索引语句创建的索引,并不能删除由创建主键约束或惟一约束语句创建的聚集索引或非聚集索引,删除上面的索引c1和u1,其代码为: Drop index customer.c1 Drop index product.u1
若删除上面的聚集索引p1,用代码Drop index customer.p1,则弹出如下所示错误消息:消息9723,级别16,状态4,第二行。
不允许对索引“customer.p1”显式地使用DROP INDEX。该索引正用于PRIMARY KEY约束的强制执行。 5 结语
本文通过创建约束和索引,得出约束与索引之间的创建联系与作用,以及它们之间的创建对彼此影响区别;通过删除约束和索引,得出约束与索引之间的删除联系和作用,以及它们之间的删除对彼此影响 区别。