用生成的系列填充列

Populate column with generated series

不小心从 Postgres 的自动递增主键 ID 列中删除了信息,我的目标是用生成的一系列数据重新填充它。例如:

UPDATE mytable
SET id = (SELECT GENERATE_SERIES(1,3456))

这会引发错误: 错误:用作表达式的子查询返回多于一行

UPDATE mytable
SET id = SELECT a.n from generate_series(1, 3456) as a(n)

(抛出语法错误)

在 PostgreSQL 中用生成的序列更新单个列的正确方法是什么?为什么 SET 在这里不起作用?

如果你有主键,你可以这样做:

UPDATE mytable t
    SET id = new_id
    FROM (SELECT tt.*, ROW_NUMBER() OVER (ORDER BY id) as new_id
          FROM mytable tt
         ) tt
    WHERE t.id = tt.id;

如果您删除了某些行的 id 列,想再次给它们一个 ID 并且不关心 ID 是什么,您可以使用类似的东西:

UPDATE mytable 
SET id = nextval('mytable_id_seq')
WHERE id IS NULL