加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – 如果我删除我的集群PK并添加一个新的,我的行将以

发布时间:2020-12-12 16:49:45 所属栏目:MsSql教程 来源:网络整理
导读:在SQL Server中,我正在查看TableA,它目前有一个uniqueidentifier聚簇主键. GUID在任何上下文中都没有意义. (我会给你一秒钟清理你的键盘和显示器并放下汽水.) 我想删除该主键并向表中添加一个新的唯一整数主键.我的问题是:当我删除索引时,将该列从uniqueiden
在SQL Server中,我正在查看TableA,它目前有一个uniqueidentifier聚簇主键. GUID在任何上下文中都没有意义.

(我会给你一秒钟清理你的键盘和显示器并放下汽水.)

我想删除该主键并向表中添加一个新的唯一整数主键.我的问题是:当我删除索引时,将该列从uniqueidentifier修改为int,并将新的聚簇唯一主键添加到修改后的列中,新PK值是否按照插入表中的顺序排列,或者它们是否为是以其他顺序?这是去正确的方式吗?这会有用吗? (关于表格创建/修改,我有点无趣.)

解决方法

删除聚簇索引时,表将成为堆.由于堆具有与索引非常不同的物理结构,因此必须将数据复制到新结构中.堆没有任何顺序.当您添加新的聚簇索引时,数据将从堆复制到新索引中,并且订单将由新的聚簇键定义.

如果要保留现有订单,那么您只需要正确分配新的整数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的顺序将与Guids的顺序相匹配.您可以删除Guid列并在新的Integer列上添加聚簇索引,并保留记录的物理顺序.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读