如何在 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
Id
和 Age
是整数,Name
是 char(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 中进行更改;最后你会发现它实际上要快得多,而且你的设计可以更加具体。例如;您将很容易为您的CONSTRAINT
s 命名(您应该已经这样做了)。以上是关于如何在 SQL Server 中创建聚集索引,同时仍保留主键?的主要内容,如果未能解决你的问题,请参考以下文章