Postgres:使用insert with select的问题

时间:2013-12-08 01:23:41

标签: sql postgresql

我有一个像这样定义的表:

CREATE TABLE wp_master (
  gid integer NOT NULL DEFAULT nextval('wp_master_gid_seq'::regclass),
  name character varying(80),
  ....
  type integer DEFAULT 4,
  CONSTRAINT p_key PRIMARY KEY (gid),
);

我想从另一个表中将数据插入到表中,所以我

insert into wp_master ( name, .... type) select "NAME", ...., 1 from ."Tiri2011";

但是我收到了错误:

ERROR:  duplicate key value violates unique constraint "p_key"
DETAIL:  Key (gid)=(2) already exists.

为什么postgres尝试将任何内容放入gid字段时,我明确没有将它包含在列列表中?我假设gid从序列中获取了它的值。

罗素

1 个答案:

答案 0 :(得分:1)

是否正在尝试插入wp_master_gid_seq序列的下一个值。将id列声明为serial(自动增量)将创建一个序列,该序列具有自动递增的最后插入ID的存储值。如果您在任何时候手动插入gid值,它会绕过序列并且自动增量函数可能会被破坏,因为序列值没有相应地更新。

修复它的最简单方法是将序列的值更改为(表的最大gid值)+ 1.只需执行一次,你应该没问题

select setval('wp_master_gid_seq', coalesce((select max(id)+1 from wp_master), 1), false)