如何以递增的值进行更新

use*_*769 4 sql postgresql sql-update

我在 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'
Run Code Online (Sandbox Code Playgroud)

这样做的问题是,内部 SELECT 仅在第一次运行,因此将相关行的 ID 设置为原始的max(id) + 1,而不是每次都设置为新的max(id) + 1,这给了我想要解决的相同问题。
任何有关如何调整此查询以实现我想要的结果或替代方法的建议将不胜感激!

Dan*_*ité 5

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

1)创作

create temporary sequence seq_upd;
Run Code Online (Sandbox Code Playgroud)

2)设置合适的初始值

select setval('seq_upd', (select max(id) from table_name));
Run Code Online (Sandbox Code Playgroud)

3)更新

update table_name set id=nextval('seq_upd') where id=1;
Run Code Online (Sandbox Code Playgroud)