使用递增值更新表中的int列

时间:2016-04-05 15:48:13

标签: sql sql-server sql-server-2008

您好我如何使用以特定值

开头的增量值更新列

例如,如果表store包含以下示例数据

ProID ProName
1     Pro1
2     Pro2
3     Pro3
etc ..

如何使用例如10的起始值更新ProID值,然后增加其余值,使其为

ProID ProName
10     Pro1
11     Pro2
12     Pro3
etc ..

2 个答案:

答案 0 :(得分:2)

我将为这个问题提供一个更通用的答案。并且,我将假设ProId具有unique索引。所以,显而易见的解决方案是:

update store
    set ProID = ProID + 9;

无法保证正常工作。它可能会生成重复项(如果已经有id = 10)。它不会填补空白。

不幸的是,我认为您需要分两步完成此操作(当存在唯一索引时)。在更新表时,问题是重复的。如果这样有效,那么很棒:

with toupdate as (
      select s.*, 9 + row_number() over (order by ProId) as new_ProId
      from store
     )
update toupdate
    set ProId = new_ProId;

但是,您可能需要这样做:

with toupdate as (
      select s.*, 9 + row_number() over (order by ProId) as new_ProId
      from store
     )
update toupdate
    set ProId = - new_ProId;  -- ensure no duplicates by using a negative sign

update store
    set ProId = - ProId;      -- get rid of the negative sign

说了这么多,更新表的主键几乎不是正确的事情。价值差距通常不是问题。查询表时可以使用row_number()来删除间隙,如果出于某种原因需要这样做。

答案 1 :(得分:1)

with cte as 
( select prodID, row_number() over (order by prodID) as rn 
  from table 
)
update cte set prodID = rn + 9