创建唯一索引

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

本主题说明如何使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 中在表上创建唯一索引。 唯一索引能够保证索引键中不包含重复的值,从而使表中的每一行从某种方式上具有唯一性。 创建 UNIQUE 约束和创建与约束无关的唯一索引并没有明显的区别。 进行数据验证的方式相同,而且对于唯一索引是由约束创建的还是手动创建的,查询优化器并不加以区分。 但是,创建列的 UNIQUE 约束会使索引目标更清晰。 有关 UNIQUE 约束的详细信息,请参阅 Unique Constraints and Check Constraints

在创建唯一索引时,可以设置一个忽略重复键的选项。 如果此选项已设置为“是”,当你试图通过添加影响多行的数据来创建重复键(使用 INSERT 语句)时,则不会添加包含重复项的行。 如果此选项设置为 “否”,则整个插入操作将失败,并且将回滚所有数据。

注意

如果单个列在多行中包含 NULL,则无法对该列创建唯一索引。 同样,如果列的组合在多行中包含 NULL,则无法对多个列创建唯一索引。 在进行索引时,它们都被视为重复值。

本主题内容

开始之前

唯一索引的优点

  • 多列唯一索引能够保证索引键中值的每个组合都是唯一的。 例如,如果为 LastNameFirstNameMiddleName 列的组合创建了唯一索引,则表中的任意两行都不会有这些列值的相同组合。

  • 只要每个列中的数据是唯一的,就可以为同一个表创建一个唯一聚集索引和多个唯一非聚集索引。

  • 唯一索引能够确保定义的列的数据完整性。

  • 唯一索引提供帮助查询优化器生成更高效的执行计划的其他信息。

典型实现

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

  • PRIMARY KEY 或 UNIQUE 约束

    在创建 PRIMARY KEY 约束时,如果不存在该表的聚集索引且未指定唯一非聚集索引,则将自动对一列或多列创建唯一聚集索引。 主键列不允许空值。

    在创建 UNIQUE 约束时,默认情况下将创建唯一非聚集索引,以便强制 UNIQUE 约束。 如果不存在该表的聚集索引,则可以指定唯一聚集索引。

    有关详细信息,请参阅 Unique Constraints and Check ConstraintsPrimary and Foreign Key Constraints

  • 独立于约束的索引

    可以为一个表定义多个唯一非聚集索引。

    有关详细信息,请参阅 CREATE INDEX (Transact-SQL)

  • 索引视图

    若要创建索引视图,请对一个或多个视图列定义唯一聚集索引。 视图将执行,并且结果集存储在该索引的页级别中,其存储方式与表数据存储在聚集索引中的方式相同。 有关详细信息,请参阅 创建索引视图

限制和局限

  • 如果数据中存在重复的键值,则不能创建唯一索引、UNIQUE 约束或 PRIMARY KEY 约束。

  • 唯一非聚集索引可以包括包含性非键列。 有关详细信息,请参阅创建带有包含列的索引

安全性

权限

要求对表或视图具有 ALTER 权限。 用户必须是 sysadmin 固定服务器角色的成员,或者是 db_ddladmindb_owner 固定数据库角色的成员。

使用 SQL Server Management Studio

使用表设计器创建唯一索引

  1. 在“对象资源管理器”中,展开包含您要创建唯一索引的表的数据库。

  2. 展开 “表” 文件夹。

  3. 右键单击你要创建唯一索引的表,然后选择“设计”

  4. 在“表设计器”菜单上,选择“索引/键”

  5. 在“索引/键”对话框中,单击“添加”

  6. 从“选定的主/唯一键或索引”文本框中选择新索引。

  7. 在主网格中,在“(常规)”下,选择“类型”,然后从列表中选择“索引”

  8. 选择“列”,然后单击省略号 (…)

  9. “索引列” 对话框中的 “列名”下,选择要编制索引的列。 最多可选择 16 列。 为获得最佳的性能,请只为每个索引选择一列或两列。 对于所选的每一列,指定索引是以升序还是以降序来排列此列的值。

  10. 选择索引的所有列后,单击 “确定”

  11. 在主网格中,在“(常规)”下,选择“是唯一的”,然后从列表中选择“是”

  12. 可选:在主网格中,在 “表设计器”下,选择 “忽略重复键” ,然后从列表中选择 “是” 。 如果要忽略尝试添加导致唯一索引中有重复键的数据,请这样做。

  13. 单击“关闭” 。

  14. 在“文件”菜单上,单击“保存”以保存 table_name

使用对象资源管理器创建唯一索引

  1. 在“对象资源管理器”中,展开包含您要创建唯一索引的表的数据库。

  2. 展开 “表” 文件夹。

  3. 展开要为其创建唯一索引的表。

  4. 右键单击“索引”文件夹,指向“新建索引”,然后选择“非群集索引…”

  5. “新建索引” 对话框的 “常规” 页中,在 “索引名称” 框中输入新索引的名称。

  6. 选中 “唯一” 复选框。

  7. 在“索引键列”下,单击“添加…”

  8. 在“从 table_name 选择列”对话框中,选中要添加到唯一索引的一个或多个表列的复选框。

  9. 单击“确定”。

  10. “新建索引” 对话框中,单击 “确定”

“使用 Transact-SQL”

创建表的唯一索引

  1. “对象资源管理器” 中,连接到 数据库引擎的实例。

  2. 在标准菜单栏上,单击 “新建查询”

  3. 将以下示例复制并粘贴到查询窗口中,然后单击“执行” 。

    USE AdventureWorks2022;  
    GO  
    -- Find an existing index named AK_UnitMeasure_Name 
    -- on the Production.UnitMeasure table and delete it if found. 
    IF EXISTS (SELECT name from sys.indexes  
               WHERE name = N'AK_UnitMeasure_Name'
               AND object_id = OBJECT_ID(N'Production.UnitMeasure', N'U'))   
       DROP INDEX AK_UnitMeasure_Name ON Production.UnitMeasure;   
    GO  
    -- Create a unique index called AK_UnitMeasure_Name  
    -- on the Production.UnitMeasure table using the Name column.  
    CREATE UNIQUE INDEX AK_UnitMeasure_Name   
       ON Production.UnitMeasure (Name);   
    GO  
    

有关详细信息,请参阅 CREATE INDEX (Transact-SQL)