使用唯一整数更新现有记录
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);
我有一个包含记录的现有 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);