我有一个像这样定义的表:
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从序列中获取了它的值。
罗素
答案 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)