我有一个包含记录的现有表格,我刚刚添加了一个新列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 );
......但当然这些都不起作用。任何人都能指出对我来说很明显吗?
答案 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);