将非集群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 进行此操作时,您应该执行以下操作以减少执行切换所需的时间:
- 使用集群 PK
创建一个名为 [CurrentName_new] 的副本 table
- 迁移数据
- 在从属 table 上删除并重新创建 FK 以指向新的 table
- 将当前 table 重命名为 [CurrentName_old]
- 将新 table 重命名为 [CurrentName]
对于具有非聚集 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 进行此操作时,您应该执行以下操作以减少执行切换所需的时间:
- 使用集群 PK 创建一个名为 [CurrentName_new] 的副本 table
- 迁移数据
- 在从属 table 上删除并重新创建 FK 以指向新的 table
- 将当前 table 重命名为 [CurrentName_old]
- 将新 table 重命名为 [CurrentName]