如何使用递增值进行更新

时间:2014-04-15 21:54:37

标签: 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'

这个问题是内部SELECT只在第一次运行,因此每次都会将相关行的ID设置为原始max(id) + 1,而不是新的max(id) + 1,这样就给了我同样的问题,我正在努力解决 任何关于如何调整此查询以实现我想要的结果或替代方法的建议都将非常感谢!

2 个答案:

答案 0 :(得分:3)

您可以使用临时序列逐步执行此操作。

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;

答案 1 :(得分:1)

如果您要使用SEQUENCE,请考虑serial pseudo data type为您id。然后你可以从"拥有的"中抽取nextval()。 (不是临时的)序列,然后自动更新。

如果您不想要,可以使用ctidrow_number()进行一次性编号:

UPDATE tbl t
SET    id = x.max_id + u.rn
FROM  (SELECT max(id) AS max_id FROM tbl) x
    , (SELECT ctid, row_number() OVER (ORDER BY ctid) AS rn
       FROM   tbl WHERE id = 1) u
WHERE  t.ctid = u.ctid;

关于dba.SE的相关答案:
numbering rows consecutively for a number of tables