使用唯一整数更新现有记录

updating existing records with a unique integer

我有一个包含记录的现有 table,我刚刚添加了一个新列 ver,我希望它是独一无二的。

create table foo (
  bar text,
  ver integer
);

select * from foo;

bar   ver
---   ---
one   null
two   null
three null

出于某种原因,我正在为如何执行此操作而苦苦挣扎。

我想做这样的事情:

update foo set ver = ( select generate_series(1, 1000) );

或者

update foo set ver = v from (select generate_series(1, 1000) as v );

...但当然这些都不起作用。谁能为我指出显而易见的地方?

使用一些 PL/pgSQL 代码:

DO
$$DECLARE
   c CURSOR FOR SELECT * FROM foo;
   x foo;
   i integer := 1;
BEGIN
   OPEN c;
   LOOP
      FETCH c INTO x;
      EXIT WHEN NOT FOUND;
      UPDATE foo SET ver = i WHERE CURRENT OF c;
      i := i + 1;
   END LOOP;
END;$$;

然后你可以添加一个唯一约束:

ALTER TABLE foo ADD UNIQUE(ver);

您需要一个主键(或唯一列)来单独更新 table 的行。在缺少这样的列时,您可以使用定义唯一的隐藏列 ctid,例如:

update foo f
set ver = rn
from (
    select ctid, row_number() over (order by ctid) as rn
    from foo
    ) s
where f.ctid = s.ctid

首先,创建一个序列。

 create sequence foo_ver;

然后添加默认值为序列中下一个数字的列。

 alter table foo add ver integer default nextval('foo_ver') not null;

数据是自动填充的,新记录将自动获得一个新的唯一编号。

可选:创建唯一索引以确保。

 create unique index on foo(ver);