一尘不染

如何用递增的值更新

sql

我在PostgreSQL中有一个表,该表具有应该是唯一的ID列。但是,当前许多行(大约300万行)的ID为“ 1”。

我知道的:

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

我需要的是一个查询,该查询将提取ID为“
1”的所有行,并为其分配一个新ID,该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每次都设置为新行,这给了我我要解决的相同问题。
任何有关如何调整此查询以达到我想要的结果或替代方法的建议,将不胜感激!


阅读 167

收藏
2021-03-08

共1个答案

一尘不染

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

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;
2021-03-08