创建唯一索引
本主题说明如何使用 SQL Server Management Studio 或 Transact-SQL 在 SQL Server 2012 中创建表的唯一索引。 唯一索引能够保证索引键中不包含重复的值,从而使表中的每一行从某种方式上具有唯一性。 创建 UNIQUE 约束和创建与约束无关的唯一索引并没有明显的区别。 进行数据验证的方式相同,而且对于唯一索引是由约束创建的还是手动创建的,查询优化器并不加以区分。 但是,创建列的 UNIQUE 约束会使索引目标更清晰。 有关 UNIQUE 约束的详细信息,请参阅唯一约束和 CHECK 约束。
在创建唯一索引时,可以设置一个忽略重复键的选项。 如果此选项已设置为**“是”,当您试图通过添加影响多行的数据来创建重复键(使用 INSERT 语句)时,则不会添加包含重复项的行; 如果此选项设置为“否”**,则整个插入操作将失败,并且将回滚所有数据。
![]() |
---|
如果单个列在多行中包含 NULL,则无法对该列创建唯一索引。 同样,如果列的组合在多行中包含 NULL,则无法对多个列创建唯一索引。 在进行索引时,它们都被视为重复值。 |
本主题内容
开始之前:
唯一索引的优点
典型实现
限制和局限
安全性
创建表的唯一索引,使用:
SQL Server Management Studio
Transact-SQL
开始之前
唯一索引的优点
多列唯一索引能够保证索引键中值的每个组合都是唯一的。 例如,如果为 LastName、FirstName 和 MiddleName 列的组合创建了唯一索引,则表中的任意两行都不会有这些列值的相同组合。
只要每个列中的数据是唯一的,就可以为同一个表创建一个唯一聚集索引和多个唯一非聚集索引。
唯一索引能够确保定义的列的数据完整性。
唯一索引提供帮助查询优化器生成更高效的执行计划的其他信息。
典型实现
唯一索引可通过以下方式实现:
PRIMARY KEY 或 UNIQUE 约束
在创建 PRIMARY KEY 约束时,如果不存在该表的聚集索引且未指定唯一非聚集索引,则将自动对一列或多列创建唯一聚集索引。 主键列不允许空值。
在创建 UNIQUE 约束时,默认情况下将创建唯一非聚集索引,以便强制 UNIQUE 约束。 如果不存在该表的聚集索引,则可以指定唯一聚集索引。
有关详细信息,请参阅唯一约束和 CHECK 约束和主键和外键约束。
独立于约束的索引
可以为一个表定义多个唯一非聚集索引。
有关详细信息,请参阅 CREATE INDEX (Transact-SQL)。
索引视图
若要创建索引视图,请对一个或多个视图列定义唯一聚集索引。 视图将执行,并且结果集存储在该索引的页级别中,其存储方式与表数据存储在聚集索引中的方式相同。 有关详细信息,请参阅创建索引视图。
限制和局限
如果数据中存在重复的键值,则不能创建唯一索引、UNIQUE 约束或 PRIMARY KEY 约束。
唯一非聚集索引可以包括包含性非键列。 有关详细信息,请参阅创建带有包含列的索引。
安全性
权限
要求对表或视图具有 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)。
[返回页首]