63

我正在尝试InterfaceID (INT)用每行唯一的值填充其列中缺少值的任何行。

我正在尝试执行此查询:

UPDATE prices SET interfaceID = (SELECT ISNULL(MAX(interfaceID),0) + 1 FROM prices) 
       WHERE interfaceID IS null

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

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

4

8 回答 8

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


update prices
set interfaceID  = @i , @i = @i + 1
where interfaceID is null

应该做的工作

于 2012-11-29T15:57:12.553 回答
22
DECLARE @IncrementValue int
SET @IncrementValue = 0 
UPDATE Samples SET qty = @IncrementValue,@IncrementValue=@IncrementValue+1
于 2016-03-03T10:31:13.303 回答
9

simple query would be, just set a variable to some number you want. then update the column you need by incrementing 1 from that number. for all the rows it'll update each row id by incrementing 1

SET @a  = 50000835 ;  
UPDATE `civicrm_contact` SET external_identifier = @a:=@a+1 
WHERE external_identifier IS NULL;
于 2015-01-14T12:26:54.987 回答
4

对于 Postgres

ALTER TABLE table_name ADD field_name serial PRIMARY KEY

参考:https ://www.tutorialspoint.com/postgresql/postgresql_using_autoincrement.htm

于 2017-01-26T09:55:34.320 回答
3

假设你有这个表的主键(你应该有),以及使用 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

我假设主键是 price-id。

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

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

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

WHERE 子句将更新限制为那些为 NULL 的行。

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

于 2017-11-14T12:28:06.370 回答
2

在基于 oracle 的产品中,您可以使用以下语句:

update table set interfaceID=RowNum where condition;
于 2015-11-22T08:32:54.633 回答
1

尝试这样的事情:

with toupdate as (
    select p.*,
           (coalesce(max(interfaceid) over (), 0) +
            row_number() over (order by (select NULL))
           ) as newInterfaceId
    from prices
   )
update p
    set interfaceId = newInterfaceId
    where interfaceId is NULL

这并不能完全使它们连续,但它确实分配了新的更高的 id。要使它们连续,请尝试以下操作:

with toupdate as (
    select p.*,
           (coalesce(max(interfaceid) over (), 0) +
            row_number() over (partition by interfaceId order by (select NULL))
           ) as newInterfaceId
    from prices
   )
update p
    set interfaceId = newInterfaceId
    where interfaceId is NULL
于 2012-11-29T16:00:27.470 回答
-1

你可以试试 :

DECLARE @counter int
SET @counter = 0
UPDATE [table]
SET [column] = @counter, @counter = @counter + 1```
于 2020-02-27T09:57:40.380 回答