在SQL Server中,我正在查看TableA,它目前有一个uniqueidentifier集群主键。 GUID在任何情况下都没有意义。
(我会给你第二个清理键盘和显示器,并放下苏打水。)
我想删除该主键,并添加一个新的唯一的整数主键到表中。 我的问题是这样的:当我删除索引时,将uniqueidentifier列修改为int,并将新的聚集唯一主键添加到修改的列中,新的PK值将按照插入到表中的顺序,或将他们有其他的顺序吗? 这是去这里的正确方法吗? 这会工作吗? (对于表格创build/修改,我是一个noobkin)。
当你删除一个聚簇索引时,这个表就变成了一个堆。 由于堆与索引具有非常不同的物理结构,数据将不得不复制到新的结构中。 堆没有任何秩序。 当您添加新的聚簇索引时,数据将从堆中复制到新索引中,并且顺序将由新聚簇键定义。
如果你想保留现有的命令,那么你所要做的就是正确地分配新的整数ID:
ALTER TABLE Table ADD Integer_Id INT; GO WITH cte AS ( SELECT ROW_NUMBER() OVER (ORDER BY Guid_Id) as RowOrderByGuid, Guid_Id FROM Table) UPDATE t SET t.Integer_Id = c.RowOrderByGuid FROM Table t JOIN cte c ON t.Guid_Id = c.Guid_Id;
现在Integer_Ids的顺序将与Guid的顺序相匹配。 您可以删除Guid列,并在新的Integer列上添加聚簇索引,并保留logging的物理顺序。
根据定义,聚集索引对实际数据页面施加物理sorting; 所以,是的,如果你删除聚集索引并创build一个新的,这将强制数据的物理重新sorting。
在你的情况下,我认为可以肯定的是会发生以下情况:
底线:您将会产生巨大的影响,您可以按照您现在得到的顺序从无序的SELECT中获取行。 你将不得不尝试。
根据定义,聚集索引决定了数据的物理顺序,因此当您创build新的聚集索引时,数据将被重新sorting; 如果是一张大桌子,计划花一点时间。
如果使用集群主键创build表,然后删除集群PK,则表中数据的物理顺序将不受干扰。 但是,查询结果的物理顺序不能保证和表中的顺序一样,所以这个顺序是没有意义的。
如果你添加一个整数列并在其上创build一个集群主键,那么这个表将被重新安排到键sorting的顺序中。这可能与GUID的物理顺序相同或不同,具体取决于键的分配方式。 您可以基于GUID键的sorting顺序(例如,使用旧的键sorting中的row_number())来明确地指定它,或者可以用其他方式指定它。 除非您采取措施确保订单明确相同,否则表中的物理订单或行不能保证您新密钥的订购。