主键上表的MSSql批量更新

时间:2012-08-01 08:00:49

标签: sql-server sql-server-2008

我已将Access DB迁移到MSSql server 2008,并发现旧数据库存在一些异常。在两个DB上,ID都是自动增量的,应该与Date一致。但是如下所示,有些是按照错误的时间顺序保存的。

**Access:**
ID  FileID  DateOfTransaction SectionID
64490   95900   02/12/1997  100
64491   95900   04/04/1996  80
64492   95900   25/03/1996  90

**Desired Correct Format:**
ID  FileID  DateOfTransaction SectionID
64492   95900   02/12/1997  100
64491   95900   04/04/1996  80
64490   95900   25/03/1996  90

PK(ID)表链接到其他几个具有更新级联设置的表。 我需要按FileID分组并按DateOfTransaction排序并相应地更新ID。

我需要一些关于如何最好地解决这个问题的建议,因为数据非常敏感。我有大约50K记录要更新。

感谢阅读!

3 个答案:

答案 0 :(得分:1)

尝试此查询

with cte as
(select * from  (
    select *,ROW_NUMBER() over (partition by FileID 
    order by DateOfTransaction) as row_num
    from t_Transactions) A
join 
    (select ID B_ID, FileID B_FileID,ROW_NUMBER() 
    over (partition by FileID order by ID) as B_row_num
    from t_Transactions) B
on A.row_num=B.B_row_num)

select T.ID [Old_ID], CTE.B_ID [New_ID],
   T.FileID,T.DateOfTransaction,T.SectionID
--update T set T.ID=CTE.B_ID  
from t_Transactions T join cte
on T.ID=CTE.ID
and CTE.B_FileID=T.FileID 

在更新之前,您可以选择并符合结果

此查询根据您的要求更新表。您已经提到ID列已链接到其他几个表。 请注意这一点,并确保更新ID列不会破坏其他任何内容

SQL Fiddle Demo

答案 1 :(得分:1)

将数据库设计为依赖于人工生成的键的顺序以匹配另一列的日期顺序是一种可怕的反模式,而不是最佳实践。

停止依赖它来表示广告订单。这就是答案。如果您需要这些数据,那么应该是与您的PK分开的另一列。无论如何,你不能按日期订购吗?如果没有,请创建一个新列。

除了将行相互关联之外,投入具有任何类型含义的内部数据库标识符始终是错误的。

我之前在一个前雇主看到过这个确切的问题 - 数据库也充斥着各种其他设计问题。实际上,FK列被命名为“frnkeyColumnName”以匹配它们指向的“keyColumnName”。别介意PK也是FK ......

停止疯狂!

答案 2 :(得分:0)

我会认真考虑你是否需要这样做。是否存在依赖于具有较晚日期的较高ID的逻辑? Access数据库中的数据是否无序,在这种情况下,无关紧要。

如果您决定继续,请先备份数据。你可能会犯错误。