sql-server - SQL Server中唯一键是聚集索引还是非聚集索引?

标签 sql-server clustered-index unique-key

我是 SQL Server 新手,在学习聚集索引时,我感到很困惑!

唯一键是聚集索引还是非聚集索引? unique key只保存列中唯一的值,包括null,所以根据这个概念,unique key应该是聚集索引,对吗?但当我读完这篇文章时,我感到困惑MSDN

When you create a UNIQUE constraint, a unique nonclustered index is created to enforce a UNIQUE constraint by default. You can specify a unique clustered index if a clustered index on the table does not already exist.

请帮助我更好地理解这个概念,谢谢。

最佳答案

可以通过三种方法来强制 SQL Server 索引的唯一性。

  • 主键约束
  • 唯一约束
  • 唯一索引(不基于约束)

它们是聚集还是非聚集与索引是否使用这些方法中的任何一种被声明为唯一无关。

这三种方法都可以创建聚集或非聚集索引。

默认情况下,如果您未指定任何不同,唯一约束和唯一索引将创建非聚集索引(如果不存在冲突的聚集索引,则 PK 默认情况下将创建为CLUSTERED)但您可以为其中任何一个显式指定CLUSTERED/NONCLUSTERED

示例语法是

CREATE TABLE T
(
X INT NOT NULL,
Y INT NOT NULL,
Z INT NOT NULL
);

ALTER TABLE T ADD PRIMARY KEY NONCLUSTERED(X);

--Unique constraint NONCLUSTERED would be the default anyway
ALTER TABLE T ADD UNIQUE NONCLUSTERED(Y); 

CREATE UNIQUE CLUSTERED INDEX ix ON T(Z);

DROP TABLE T;

对于未指定为唯一的索引,SQL Server 将以任何方式默默地使其唯一。对于聚集索引,这是通过将唯一符附加到重复键来完成的。对于非聚集索引,行标识符(逻辑或物理)被添加到键中以保证唯一性。

关于sql-server - SQL Server中唯一键是聚集索引还是非聚集索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39318547/

相关文章:

sql-server - 按年、月、日对集合进行分组

oracle - 我应该避免使用主键并使用索引的唯一列吗?

数据库:主键,集群或非集群

azure - 如何使用嵌套属性在 cosmos DB 中定义唯一键

php - 获取给定字符串的唯一 8 位数字

sql - 根据输入的关键字排序

SQL:如何从递归查询创建 View ?

sql-server - 我应该在存储过程中的临时表上创建主键吗?

database - 在 sql server 2008 中更新聚集列的成本是多少

python - 在递增现有值的同时向字典添加新键