我在 PostgreSQL 中有一个表,其中的 ID 列应该是唯一的。 然而,目前大量行(大约 300 万行)的 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
,这给了我同样的问题来解决。您可以按照临时顺序逐步进行。
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;
如果您要使用
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.
参见: