本主题介绍如何使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 2014 中的表上创建唯一索引。 唯一索引保证索引键不包含重复值,因此表中的每一行都以某种方式是唯一的。 创建 UNIQUE 约束和创建独立于约束的唯一索引之间没有显著差异。 数据验证以相同的方式进行,并且查询优化器不区分由约束创建或手动创建的唯一索引。 但是,在列上创建 UNIQUE 约束会使索引的目标清晰明了。 有关 UNIQUE 约束的详细信息,请参阅 “唯一约束”和“检查约束”。
创建唯一索引时,可以设置一个选项来忽略重复键。 如果此选项设置为 “是 ”,并且您尝试通过添加影响多行的数据(使用 INSERT 语句)创建重复键,则不会添加包含重复项的行。 如果设置为 “否”,则整个插入作将失败,所有数据将回滚。
注释
如果该列在多行中包含 NULL,则不能对单个列创建唯一索引。 同样,如果多行中的列组合包含 NULL,则不能对多个列创建唯一索引。 这些值被视为索引目的的重复值。
本主题内容
准备工作:
若要对表创建唯一索引,请使用:
在您开始之前
唯一索引的优点
多列唯一索引保证索引键中的每个值组合都是唯一的。 例如,如果在 LastName、 FirstName 和 MiddleName 列的组合上创建了唯一索引,则表中的两行不能对这些列具有相同的值组合。
如果每个列中的数据是唯一的,则可以在同一表中创建唯一聚集索引和多个唯一的非聚集索引。
唯一索引可确保定义的列的数据完整性。
唯一索引为查询优化器提供了有助于生成更高效的执行计划的其他信息。
典型实现
以下列方式实现唯一索引:
主键或唯一性约束
创建 PRIMARY KEY 约束时,如果表中的聚集索引尚不存在且未指定唯一的非聚集索引,则会自动创建列或列的唯一聚集索引。 主键列不能允许 NULL 值。
创建 UNIQUE 约束时,会创建唯一的非聚集索引,以默认强制实施 UNIQUE 约束。 如果表上的聚集索引尚不存在,则可以指定唯一聚集索引。
有关详细信息,请参阅 唯一约束和 Check 约束 以及 主键和外键约束。
独立于约束的索引
可以在表上定义多个唯一的非聚集索引。
有关详细信息,请参阅 CREATE INDEX(Transact-SQL)。
索引视图
若要创建索引视图,请在一个或多个视图列上定义唯一聚集索引。 视图被执行,结果集以与表数据存储在聚集索引中相同的方式存储在索引的叶级别。 有关详细信息,请参阅 创建索引视图。
局限性与限制
如果数据中存在重复的键值,则无法创建唯一索引、UNIQUE 约束或 PRIMARY KEY 约束。
唯一的非聚集索引可以包含包含的非键列。 有关详细信息,请参阅 Create Indexes with Included Columns。
安全
权限
需要对表或视图具有 ALTER 权限。 用户必须是 sysadmin 固定服务器角色的成员或 db_ddladmin 和 db_owner 固定数据库角色的成员。
使用 SQL Server Management Studio
使用表设计器创建唯一索引
在对象资源管理器中,展开包含要在其中创建唯一索引的表的数据库。
展开 表格 文件夹。
右键点击要创建唯一索引的表,然后选择设计。
在“表设计器”菜单上,选择“索引/键”。
在“ 索引/键 ”对话框中,单击“ 添加”。
在 “所选主键/唯一键”或“索引 ”文本框中选择新索引。
在主网格的 “常规”下,选择“ 类型 ”,然后从列表中选择 “索引 ”。
选择《列》,然后单击省略号 (...)。
在“ 索引列 ”对话框中的 “列名称”下,选择要编制索引的列。 最多可以选择 16 列。 为了获得最佳性能,请为每个索引仅选择一两列。 对于所选的每个列,指示索引是按升序还是降序排列此列的值。
选择索引的所有列后,单击“ 确定”。
在网格的 “常规”下,选择 “是否唯一”,并且从列表中选择 “是”。
可选:在主网格的 表设计器下,选择“ 忽略重复键 ”,然后从列表中选择“ 是 ”。 如果要忽略在唯一索引中创建重复键的数据的尝试,请执行此操作。
单击 “关闭” 。
在“ 文件 ”菜单上,单击“ 保存table_name。
使用对象资源管理器创建唯一索引
在对象资源管理器中,展开包含要在其中创建唯一索引的表的数据库。
展开 表格 文件夹。
展开要在其中创建唯一索引的表。
右键单击 “索引 ”文件夹,指向 “新建索引”,然后选择“ 非聚集索引...”。
在“ 新建索引 ”对话框中的“ 常规 ”页上,在 “索引名称 ”框中输入新索引的名称。
选中 “唯一 ”复选框。
在 “索引键列”下,单击“ 添加...”。
在“从table_name中选择列”对话框中,选中要添加到唯一索引的表列或列的复选框。
单击 “确定” 。
在“ 新建索引 ”对话框中,单击“ 确定”。
使用 Transact-SQL
在表上创建唯一索引
在 “对象资源管理器” 中,连接到某个数据库引擎实例。
在标准栏上,单击“新建查询”。
将以下示例复制并粘贴到查询窗口中,然后单击 执行。
USE AdventureWorks2012; GO -- Find an existing index named AK_UnitMeasure_Name and delete it if found IF EXISTS (SELECT name from sys.indexes WHERE name = N'AK_UnitMeasure_Name') 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)。