INSERT 失败,因为主键已经存在
INSERT fails because primary key already exists
我正在使用 PostgreSQL 9.4 和 pgAdminIII 1.20 客户端。在特定 table 上启动 INSERT
时,我收到一条错误消息:Details: the key (gid)=(31509) already exists. (SQL State: 23505)
。
为了让序列完成工作,我没有在命令中输入 gid 值:
INSERT INTO geo_section (idnum, insee, ident) VALUES (25, '015233', '') ;
序列定义如下:
CREATE SEQUENCE geo_section_gid_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 31509
CACHE 1;
ALTER TABLE geo_section_gid_seq
OWNER TO postgres;
下面查询returns34502
:
SELECT max(gid) FROM geo_section ;
因此,我试图改变序列以便从 34503
:
开始序列
ALTER SEQUENCE geo_section_gid_seq START 34503 ;
我收到一条成功消息,说明查询已正确执行。但是序列 START
参数仍然具有 31509
值...
要更改序列的下一个值,请使用 setval 函数:
select setval('geo_section_gid_seq'::regclass,34503,false)
false :如果您希望下一个值是 34503
true :如果您希望下一个值是 34504
你应该执行这条命令:
SELECT setval('geo_section_gid_seq', (SELECT MAX(gid) FROM 'geo_section'), true)
我正在使用 PostgreSQL 9.4 和 pgAdminIII 1.20 客户端。在特定 table 上启动 INSERT
时,我收到一条错误消息:Details: the key (gid)=(31509) already exists. (SQL State: 23505)
。
为了让序列完成工作,我没有在命令中输入 gid 值:
INSERT INTO geo_section (idnum, insee, ident) VALUES (25, '015233', '') ;
序列定义如下:
CREATE SEQUENCE geo_section_gid_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 31509
CACHE 1;
ALTER TABLE geo_section_gid_seq
OWNER TO postgres;
下面查询returns34502
:
SELECT max(gid) FROM geo_section ;
因此,我试图改变序列以便从 34503
:
ALTER SEQUENCE geo_section_gid_seq START 34503 ;
我收到一条成功消息,说明查询已正确执行。但是序列 START
参数仍然具有 31509
值...
要更改序列的下一个值,请使用 setval 函数:
select setval('geo_section_gid_seq'::regclass,34503,false)
false :如果您希望下一个值是 34503
true :如果您希望下一个值是 34504
你应该执行这条命令:
SELECT setval('geo_section_gid_seq', (SELECT MAX(gid) FROM 'geo_section'), true)