一尘不染

将主键从非集群更改为集群

sql

假设我有一个SQL Server 2005表TableX,上面有2个索引:

PK_TableX =在FieldA上已主键
IX_TableX_FieldB =在FieldB上已主键

我想将PK切换为CLUSTERED,将其他索引切换为NONCLUSTERED。

我必须假设在尝试更改索引时将使用数据库-因此,我要避免的主要担心是,在过程中的某个时刻,表上将不存在PK约束。我想避免插入重复密钥的任何风险。

即我不能只是删除主键并重新创建它。

此过程需要通过SQL脚本而不是通过SSMS完成。

我有一种我认为可行的方法(我将其发布为可能的答案),但想将其打开,以防我遗漏某些东西或存在另一种/更好的方法。另外,将来可能对其他人有用


阅读 141

收藏
2021-03-17

共1个答案

一尘不染

1)首先删除现有的聚集索引(IX_TableX_FieldB):

   DROP INDEX TableX.IX_TableX_FieldB

2)在主键中引用的唯一字段上创建(临时)UNIQUE约束

    ALTER TABLE TableX
    ADD CONSTRAINT UQ_TableX UNIQUE(FieldA)

3)放下PRIMARY KEY

    ALTER TABLE TableX
    DROP CONSTRAINT PK_TableX

4)重新创建主键

   ALTER TABLE TableX
   ADD CONSTRAINT PK_TableX PRIMARY KEY CLUSTERED(FieldA)

5)删除临时UNIQUE约束

   ALTER TABLE TableX
   DROP CONSTRAINT UQ_TableX

6)将IX_TableX_FieldB重新添加为NONCLUSTERED

   CREATE NONCLUSTERED INDEX IX_TableX_FieldB ON TableX(FieldB)
2021-03-17