2013-04-08 104 views
0

该表中的主键ID值正在我们最近合并的2个系统中使用,但是其中一个系统中有大量项目指向错误的id值,我需要更新ID (PK)值,以便600万个现有项目将指向正确的行。最简单的方法来更新sql服务器中的行ID?

enter image description here

ID要更新的ID列如下:

ID 
1 to 5 
2 to 6 
3 to 7 
4 to 1 
5 to 2 
6 to 3 
7 to 4 
+0

“ID”是主键吗?你为什么想这样做?你期望不得不经常这样做吗? – 2013-04-08 14:03:42

+0

你为什么想这样做? – 2013-04-08 14:03:52

+0

如果您使用'ID'列来排序结果,则不要 - 具有特定的排序列。我正在努力想出为什么你会关心身份证号码的另一个原因。另外,'ID'是一个'Identity'列吗?而且有什么东西将它用作外键? – 2013-04-08 14:06:28

回答

1

好吧,假设它是不是一个IDENTITY列(在这种情况下你需要设置IDENTITY_INSERT上)那么下面应该工作(见SQLFiddle例如)

UPDATE MyTable 
SET ID = 
    CASE WHEN ID >= 4 SET ID - 3 
     ELSE ID + 4 
    END 
+0

嗨,即使我已将IDENTITY_INSERT设置为ON,即时获取以下错误 “Msg 8102,Level 16,State 1,Line 2 无法更新标识列'ID'。” – Xerxes 2013-04-08 14:32:05

+1

@Xerxes请参阅[此问题]的接受答案(http://stackoverflow.com/questions/3947453/override-identity-column),它解释了如何执行标识列的更新。基本上,你需要创建一个新的行,然后删除旧的行。 – 2013-04-08 14:44:23

0

使用更新查询与case语句

Update tableName set PkId = Case PkId 
    When 1 then 5 
    When 2 then 6 
    When 3 then 7 
    When 4 then 1 
    When 5 then 2 
    When 6 then 3 
    When 7 then 4 End 
Where PkId In (1,2,3,4,5,6,7) 

如果你的答案AER需要被变更的值只是一小部分的值(请在所有600万需要改变吗?),那么你需要创建一个具有老不正确的值映射表和新的正确的值,并使用(与联合),而不是case语句。

Update t set PkId = map.NewPkId 
From tablename t 
    Join mappingTable m 
     On m.oldPkId = t.PkId 
+0

嗨,即使我已经将IDENTITY_INSERT设置为“消息8102,级别16,状态1,行2无法更新标识列'ID'即时获取以下错误。” – Xerxes 2013-04-08 14:42:16

相关问题