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

Mal*_*are 50 sql sql-server sql-server-2008

我试图填充任何缺少其InterfaceID (INT)列中值的行,每行具有唯一值.

我正在尝试执行此查询:

UPDATE prices SET interfaceID = (SELECT ISNULL(MAX(interfaceID),0) + 1 FROM prices) 
       WHERE interfaceID IS null
Run Code Online (Sandbox Code Playgroud)

我希望(SELECT ISNULL(MAX(interfaceID),0) + 1 FROM prices)对每一行进行评估,但它只进行一次,所以我所有受影响的行都得到相同的值而不是不同的值.

这可以在一个查询中完成吗?

WKo*_*dos 75

declare @i int  = SELECT ISNULL(MAX(interfaceID),0) + 1 FROM prices


update prices
set interfaceID  = @i , @i = @i + 1
where interfaceID is null
Run Code Online (Sandbox Code Playgroud)

应该做的工作

  • 在`(SELECT ISNULL(MAX(interfaceID),0)+ 1 FROM FROM)周围添加括号 (6认同)
  • 检查[this](http://haacked.com/archive/2004/02/28/sql-auto-increment.aspx/),希望帮助某人. (2认同)

小智 17

DECLARE @IncrementValue int
SET @IncrementValue = 0 
UPDATE Samples SET qty = @IncrementValue,@IncrementValue=@IncrementValue+1
Run Code Online (Sandbox Code Playgroud)


Dev*_*per 5

简单的查询就是,只需将变量设置为所需的数字即可。然后通过从该数字增加1来更新所需的列。对于所有行,它将通过递增1来更新每个行ID

SET @a  = 50000835 ;  
UPDATE `civicrm_contact` SET external_identifier = @a:=@a+1 
WHERE external_identifier IS NULL;
Run Code Online (Sandbox Code Playgroud)


Kev*_*ann 5

假设您有该表的主键(您应该有),并且使用 CTE 或 WITH,还可以使用自联接更新到同一个表:

UPDATE a
SET a.interfaceId = b.sequence
FROM prices a
INNER JOIN
(
   SELECT ROW_NUMBER() OVER ( ORDER BY b.priceId ) + ( SELECT MAX( interfaceId ) + 1 FROM prices ) AS sequence, b.priceId
   FROM prices b
   WHERE b.interfaceId IS NULL
) b ON b.priceId = a.priceId
Run Code Online (Sandbox Code Playgroud)

我假设主键是价格 ID。

派生表(别名 b)用于通过 ROW_NUMBER() 函数与主键列一起生成序列。对于列 interface-id 为 NULL 的每一行,这将生成具有唯一序列值以及主键值的行。

可以按其他顺序而不是主键对序列进行排序。

该序列通过子查询偏移当前 MAX interface-id + 1。MAX() 函数忽略 NULL 值。

WHERE 子句限制对 NULL 行的更新。

然后将派生表连接到同一个表(别名 a),连接主键列并将要更新的列设置为生成的序列。