如何在 SQL Server 中创建聚集索引,同时仍保留主键?

Posted

技术标签:

【中文标题】如何在 SQL Server 中创建聚集索引,同时仍保留主键?【英文标题】:How to create a clustered index in SQL Server while still preserving the primary key? 【发布时间】:2022-01-04 00:43:17 【问题描述】:

我有一个名为 Players 的表,其中包含这些列

Id, Name, Age

IdAge 是整数,Namechar(50)

我想在这个表上创建一个聚集索引,以便该表将按Name 升序排序。我发现每个有主键的表在主键上都已经有一个聚集索引,而一个表上只能有一个聚集索引,如果我想添加另一个,我必须删除主键Id 上的约束。

我的Player.Id 已经作为多个其他表中的外键,所以我仍然希望对Id 进行主键约束,但我还想要一个聚集索引来按名称对记录进行排序。

如何在 SQL Server 中做到这一点?我正在使用 Microsoft SQL Server Management Studio。

【问题讨论】:

你为什么要Name 的索引,你是按那个列查找的吗?您要支持哪些查询?在您看来,为什么它需要聚集,为什么不能是非聚集索引?这并不是说这都是一个坏主意,它可能是一个好主意,但我不知道你的用例。总而言之:您必须删除并重新创建主键才能将其更改为非集群,以便您可以集群在不同的键上 【参考方案1】:

你需要:

    首先删除表中的所有 FK 约束Player 然后删除Id 上的主聚集索引 在Player.Id 上创建具有非聚集索引的新主键 - 使用以下命令: ALTER TABLE dbo.Player ADD CONSTRAINT PK_Player PRIMARY KEY NONCLUSTERED (Id); 然后在Player.Name上创建一个聚集索引 将所有表中的所有 FK 约束重新建立到 Player

【讨论】:

我该怎么做 3?在 SSMS 中,我右键单击表的设计选项卡中的列,然后选择“选择主键”,这将创建一个集群 PK。如何使用非聚集索引创建 pk? 我通过在 (Id) 之前放置 NONCLUSTERED 关键字来解决它 强烈建议转储可视化设计器并使用 T-SQL 语句来执行此操作。设计器似乎检测到您创建了非集群 PK,然后恢复该更改....忘记设计器 - 使用正确的 T-SQL T-SQL解决了,谢谢! 我真的建议你尽可能多地习惯编写 T-SQL;尤其是物体。设计器缺乏功能,并且具有“功能”(阅读缺陷)。您最好学习语法以自己在 T-SQL 中进行更改;最后你会发现它实际上要快得多,而且你的设计可以更加具体。例如;您将很容易为您的CONSTRAINTs 命名(您应该已经这样做了)。

以上是关于如何在 SQL Server 中创建聚集索引,同时仍保留主键?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Create Table 中创建非聚集索引?

如何在 SQL Server 2012 中创建的临时表上查找索引列表

SQL Server 索引视图

sqlserver的索引

SqlServer中创建非聚集索引和非聚集索引

sql server 索引阐述系列三 表的堆组织