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

时间:2012-11-29 15:44:47

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

我正在尝试使用每行唯一值填充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),但它只执行一次,所以我所有受影响的行都得到相同的值而不是不同的值。

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

8 个答案:

答案 0 :(得分:74)

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


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

应该做的工作

答案 1 :(得分:17)

DECLARE @IncrementValue int
SET @IncrementValue = 0 
UPDATE Samples SET qty = @IncrementValue,@IncrementValue=@IncrementValue+1

答案 2 :(得分:4)

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

来更新每个行id
SET @a  = 50000835 ;  
UPDATE `civicrm_contact` SET external_identifier = @a:=@a+1 
WHERE external_identifier IS NULL;

答案 3 :(得分:2)

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

update table set interfaceID=RowNum where condition;

答案 4 :(得分:2)

对于Postgres

ALTER TABLE table_name ADD field_name serial PRIMARY KEY

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

答案 5 :(得分: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

答案 6 :(得分:1)

假设您拥有此表的主键(您应该拥有),以及使用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接口-id + 1通过子查询偏移。 MAX()函数忽略NULL值。

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

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

答案 7 :(得分:-1)

您可以尝试:

DECLARE @counter int
SET @counter = 0
UPDATE [table]
SET [column] = @counter, @counter = @counter + 1```