创建唯一索引

创建唯一索引可以确保任何生成重复键值的尝试都会失败。创建 UNIQUE 约束和创建与约束无关的唯一索引并没有明显的区别。进行数据验证的方式相同,而且对于唯一索引是由约束创建的还是手动创建的,查询优化器并不加以区分。但是,在进行数据集成时,应当对列创建 UNIQUE 约束。这可以使索引的目的更加明晰。

典型实现

惟一索引可通过以下方式实现:

  • PRIMARY KEY 或 UNIQUE 约束
    在创建 PRIMARY KEY 约束时,如果不存在该表的聚集索引且未指定唯一非聚集索引,则将自动对一列或多列创建唯一聚集索引。主键列不允许空值。
    在创建 UNIQUE 约束时,默认情况下将创建唯一非聚集索引,以便强制添加 UNIQUE 约束。如果不存在该表的聚集索引,则可以指定唯一聚集索引。
    有关详细信息,请参阅 PRIMARY KEY 约束UNIQUE 约束
  • 独立于约束的索引
    可以为一个表定义多个唯一非聚集索引。
    有关详细信息,请参阅 CREATE INDEX (Transact-SQL)
  • 索引视图
    若要创建索引视图,请对一个或多个视图列定义唯一聚集索引。视图的执行(具体化)和结果集的存储都是在索引叶级别进行的。结果集的存储方式与表数据在聚集索引中的存储方式相同。有关详细信息,请参阅创建索引视图

解决重复值问题

如果在键列中存在重复值,将无法创建唯一索引或约束。例如,如果要对 FirstName 列和 LastName 列创建唯一组合索引,但是表中有两行数据在 FirstNameLastName 列的值均为 Jane Smith,则这种情况下将无法创建唯一索引。要解决此问题,可以使用下列方法之一:

  • 在索引定义中添加或删除列以创建唯一组合。在前面的例子中,向索引定义中添加 MiddleName 列可以解决重复问题。
  • 如果重复值是因数据输入错误引起的,则可以先手动更正数据,然后创建索引或约束。

使用 IGNORE_DUP_KEY 选项来处理重复值。

在创建或修改唯一索引或约束时,您可以将 IGNORE_DUP_KEY 选项设置为 ON 或 OFF。当索引创建后,此选项指定对操作多行的 INSERT 语句中所出现的重复键值错误的响应方式。当 IGNORE_DUP_KEY 设置为 OFF(默认设置)时,如果有一行或多行含有重复键值,则 SQL Server 2005 数据库引擎 将拒绝语句操作的所有行。当设置为 ON 时,只有包含重复键值的行被拒绝后,才能添加非重复键值。

例如,如果一个单条语句向某个具有唯一索引的表中插入 20 行,而其中 10 行含有重复键值,则默认情况下全部 20 行都将被拒绝。但是,如果索引选项 IGNORE_DUP_KEY 设置为 ON,则只有 10 个重复键值会被拒绝,其他 10 个非重复键值将插入到表中。

该选项设置存储在索引的元数据中。若要显示当前设置,请使用 sys.indexes 目录视图。

ms175132.note(zh-cn,SQL.90).gif注意:
对于为视图创建的索引或 XML 索引,不能指定 IGNORE_DUP_KEY。

处理 NULL 值

为了利于创建索引,NULL 值与 NULL 值比较作相等处理。因此,如果不止一行中的键值为 NULL,则不能创建唯一索引或 UNIQUE 约束,当为唯一索引或唯一约束选择列时,请选择定义为 NOT NULL 的列。

磁盘空间需求

确定唯一索引的磁盘空间需求的过程与聚集索引和非聚集索引相同。有关索引的磁盘空间需求的详细信息,请参阅确定索引的磁盘空间要求

在创建表时创建索引

CREATE TABLE (Transact-SQL)

对现有表创建索引

CREATE INDEX (Transact-SQL)

请参阅

概念

填充因子
index create memory 选项
修改索引
在文件组上放置索引
PRIMARY KEY 约束
UNIQUE 约束

其他资源

ALTER INDEX (Transact-SQL)
sys.indexes (Transact-SQL)

帮助和信息

获取 SQL Server 2005 帮助