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

Sql server 将非集群PK重建为集群PK?,sql-server,database,sql-server-2008-r2,Sql Server,Database,Sql Server 2008 R2,对于具有非聚集主键且完全没有聚集索引的产品表:是否可以使用ALTER index..REBUILD(或任何简单方法)将非聚集主键更改为聚集主键?怎么做? 我很高兴避免掉一个,因为还有其他一些限制表阻止我掉产品 编辑: 我发现,使用TOAD for SQL Server(我有免费的社区版),我可以右键单击一个表,选择Alter table,将Clustered从False更改为True,它会生成一个可怕但有效的脚本,在该脚本中创建一个新表,复制数据,删除并重新创建/重命名它需要的所有内容。 但是

对于具有非聚集主键且完全没有聚集索引的产品表:是否可以使用
ALTER index..REBUILD
(或任何简单方法)将
非聚集主键更改为
聚集主键?怎么做?
我很高兴避免掉一个,因为还有其他一些限制表阻止我掉产品


编辑:
我发现,使用TOAD for SQL Server(我有免费的社区版),我可以右键单击一个表,选择Alter table,将Clustered从False更改为True,它会生成一个可怕但有效的脚本,在该脚本中创建一个新表,复制数据,删除并重新创建/重命名它需要的所有内容。

但是,我仍然希望有一种推荐的方法可以使用一个特殊的工具来实现这一点,您可以使用
DROP\u EXISTING=ON
选项创建聚集索引。如果愿意的话,也可以这样创建主键



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

  • 首先删除引用此PK的所有FK
  • 忽略PK的约束部分,并简单地将PK的索引部分重新创建为唯一的
  • 最后,重新创建步骤1中删除的所有FK
如果这是一个非常大的表,并且您无法承受该表将被锁定的时间,或者如果您无法承受在执行此操作时相关表上发生的操作的孤立数据的可能性,则应执行以下操作以减少切换所需的时间:

  • 创建一个名为[CurrentName\u new]的具有集群PK的重复表
  • 迁移数据
  • 在从属表上删除并重新创建FK,以指向新表
  • 将当前表重命名为[CurrentName\u old]
  • 将新表重命名为[CurrentName]

  • 事实上,这就是TOAD(请参见我的编辑)所做的。我没有找到使用CREATE with DROP_EXISTING=ON来更改集群属性的方法。你会怎么做?我已经添加了一个例子。要明确的是:聚集不是一个可以在索引上更改的属性。SQL Server与其索引语法DDL非常不一致。索引的某些属性只能使用DROP_现有语法进行更改。
    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