使用新ID复制数据

时间:2015-07-28 10:08:57

标签: postgresql plpgsql

有没有办法使用新ID将某些行复制到同一个表中? 我的桌子是这样的:

ID | data
 1 | SOMETHING
 2 | SOMETHING
 3 | SOMETHING

我有旧ID:'{1,513,3,4,5}'和新ID:'{1338,7,512,9,10}'我需要添加行1338,其中包含来自行1,7的数据< = 513等。与old[0] = new[0]类似。

目前我正在使用循环:

SELECT old_ids INTO oIds FROM vars_table WHERE sid = id;
FOR i IN 0..array_length(new_ids, 1) LOOP
  INSERT INTO ids(ID, data)
    SELECT new_ids[i], data
    FROM ids
    WHERE id = oIds[i]
    AND NOT EXISTS(SELECT 1 FROM ids WHERE id = new_ids[i]);
END LOOP;

有更好的方法吗?也许在1个查询中?

1 个答案:

答案 0 :(得分:0)

不需要循环:

insert into the_table (id, data)
select id + 5, data
from the_table;

但是,上面要求您知道表中有多少行。要考虑当前行数,您可以:

insert into the_table (id, data)
select id + (select max(id) from the_table), data
from the_table;

注意:以上在多用户环境中 NOT 是安全的。只有在你是唯一一个这样做的人时才应该使用它。

处理此类数据重复的最佳方法是将ID列定义为serial,让Postgres处理创建新值:

create table the_table (id serial not null, data text);

然后将插入初始数据:

insert into the_table (data)
values ('foo'), ('bar'), ('foobar');

复制数据非常简单:

insert into the_table (data)
select data 
from the_data;