如何以增量值更新

问题描述 投票:0回答:2

我在 PostgreSQL 中有一个表,其中的 ID 列应该是唯一的。 然而,目前大量行(大约 300 万行)的 ID 为“1”。

我所知道的:

  • 总行数
  • ID 列的当前最大值
  • ID(不正确)为“1”的行数

我需要的是一个查询,它将提取 ID 为“1”的所有行,并为它们分配一个自动递增的新 ID,以便表中的每一行都具有唯一的 ID。 我希望它从

currentMaxId + 1
开始,并为每一行分配后续 ID。

这是我得到的最接近的查询:

UPDATE table_name
SET id = (
    SELECT max(id) FROM table_name
) + 1
WHERE id = '1'

这样做的问题是内部 SELECT 仅在第一次运行,因此每次都将相关行的 ID 设置为原始

max(id) + 1
,而不是新的
max(id) + 1
,这给了我同样的问题来解决。
任何有关如何调整此查询以实现我想要的结果或替代方法的建议将不胜感激!

sql postgresql sql-update
2个回答
6
投票

您可以按照临时顺序逐步进行。

1)创造

create temporary sequence seq_upd;

2)设置合适的初始值

select setval('seq_upd', (select max(id) from table_name));

3)更新

update table_name set id=nextval('seq_upd') where id=1;

2
投票

如果您要使用

SEQUENCE
,请考虑为您的 serial 使用
id
 伪数据类型。然后你可以从“拥有的”序列中绘制
nextval()
,它将自动更新。

如果您不想这样做,您可以重新使用

ctid
row_number()
进行一次性编号:

UPDATE tbl t
SET    id = x.max_id + u.rn
FROM  (SELECT max(id) AS max_id FROM tbl) x
    , (SELECT ctid, tableoid
            , row_number() OVER (ORDER BY ctid) AS rn
       FROM   tbl WHERE id = 1) u
WHERE  t.ctid = u.ctid;
AND    t.tableoid = u.tableoid;  -- only necessary for inheritance, partitioning, or similar.

参见:

© www.soinside.com 2019 - 2024. All rights reserved.