【问题标题】:How to create a clustered index in SQL Server while still preserving the primary key?如何在 SQL Server 中创建聚集索引,同时仍保留主键?
【发布时间】: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 的索引,你是按那个列查找的吗?您要支持哪些查询?在您看来,为什么它需要聚集,为什么不能是非聚集索引?这并不是说这都是一个坏主意,它可能是一个好主意,但我不知道你的用例。总而言之:您必须删除并重新创建主键才能将其更改为非集群,以便您可以集群在不同的键上

标签: sql-server ssms


【解决方案1】:

你需要:

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

【讨论】:

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