创建唯一索引

创建唯一索引可以确保任何生成重复键值的尝试都会失败。创建 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。此选项指定在插入操作试图向唯一索引中插入重复键值时的错误响应。IGNORE_DUP_KEY 选项仅适用于创建或重新生成索引后发生的插入操作。在执行 CREATE INDEXALTER INDEXUPDATE 时,该选项不起作用。默认值为 OFF。

  • ON
    向唯一索引中插入重复键值时将出现一条警告消息。只有违反唯一性约束的行才将失败。

  • OFF
    向唯一索引中插入重复键值时将出现一条错误消息。整个 INSERT 操作将被回滚。

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

对于对视图创建的索引、非唯一索引、XML 索引、空间索引以及筛选索引,IGNORE_DUP_KEY 不能为 ON。

若要查看 IGNORE_DUP_KEY,请使用 sys.indexes

在向后兼容的语法中,WITH IGNORE_DUP_KEY 等效于 WITH IGNORE_DUP_KEY = ON。

处理 NULL 值

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

磁盘空间要求

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

在创建表时创建索引

对现有表创建索引