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

时间:2017-10-09 13:36:41

标签: postgresql sql-update unique generate-series

我有一个包含记录的现有表格,我刚刚添加了一个新列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 );

......但当然这些都不起作用。任何人都能指出对我来说很明显吗?

3 个答案:

答案 0 :(得分:4)

您需要一个主键(或唯一列)来单独更新表的行。如果没有这样的列,您可以使用隐藏列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

答案 1 :(得分:1)

使用一些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);

答案 2 :(得分:0)

首先,创建一个序列。

 create sequence foo_ver;

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

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

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

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

 create unique index on foo(ver);