将非集群PK重建为集群PK?

Rebuild a non clustered PK into a clustered one?

对于具有非聚集 PK 且根本没有聚集索引的产品 table:是否可以使用 ALTER INDEX..REBUILD(或任何简单方法)更改 NON CLUSTERED PK变成 CLUSTERED 一个?怎么样?
我很乐意避免 DROP,因为还有其他 table 的约束阻止我放弃 Products PK。


编辑:
我发现使用 TOAD for SQL Server(我有免费的 community edition),我可以右击 table, select Alter Table,将 Clustered 从 False 更改为 True,它会生成一个可怕但有效的脚本,它会在其中创建一个新的 table、复制数据、删除和 re-create/rename 它所包含的所有内容需要。
不过还是希望有推荐的方法,用专门的工具来做

您可以使用 DROP_EXISTING = ON 选项创建聚簇索引。如果您愿意,也可以通过这种方式创建主键。


BEGIN TRAN

SELECT *
INTO o
FROM sys.objects

CREATE UNIQUE NONCLUSTERED INDEX sjhfg ON o (object_ID)
CREATE UNIQUE CLUSTERED INDEX sjhfg ON o (object_ID) WITH (DROP_EXISTING = ON)

SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID('o')

ROLLBACK

大多数文章/答案表明这是不可能的。但是,正如@usr 的回答所示,可以将非聚集索引转换为聚集索引。由于我们正在处理 PK,因此需要:

  • 首先删除引用此 PK 的所有 FK
  • 忽略 PK 的约束部分并简单地将 PK 的索引部分重新创建为 UNIQUE CLUSTERED
  • 最后,重新创建在步骤 1 中删除的所有 FK

如果这是一个非常大的 table 并且您无法承受锁定此 table 的时间,或者如果您无法承受在相关的操作上发生孤立数据的可能性tables 进行此操作时,您应该执行以下操作以减少执行切换所需的时间:

  1. 使用集群 PK
  2. 创建一个名为 [CurrentName_new] 的副本 table
  3. 迁移数据
  4. 在从属 table 上删除并重新创建 FK 以指向新的 table
  5. 将当前 table 重命名为 [CurrentName_old]
  6. 将新 table 重命名为 [CurrentName]