假设我有一个SQL Server 2005表TableX,上面有2个索引:
PK_TableX =在FieldA上已主键 IX_TableX_FieldB =在FieldB上已主键
我想将PK切换为CLUSTERED,将其他索引切换为NONCLUSTERED。
我必须假设在尝试更改索引时将使用数据库-因此,我要避免的主要担心是,在过程中的某个时刻,表上将不存在PK约束。我想避免插入重复密钥的任何风险。
即我不能只是删除主键并重新创建它。
此过程需要通过SQL脚本而不是通过SSMS完成。
我有一种我认为可行的方法(我将其发布为可能的答案),但想将其打开,以防我遗漏某些东西或存在另一种/更好的方法。另外,将来可能对其他人有用
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)