【问题标题】:INSERT fails because primary key already existsINSERT 失败,因为主键已经存在
【发布时间】:2016-10-29 05:41:54
【问题描述】:

我正在使用 PostgreSQL 9.4 和 pgAdminIII 1.20 客户端。在特定表上启动 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;

以下查询返回34502

SELECT max(gid) FROM geo_section ;

因此,我尝试更改序列以便从34503 开始序列:

ALTER SEQUENCE geo_section_gid_seq START 34503 ;

我收到一条成功消息,说明查询已正确执行。但是序列START 参数仍然是31509 值...

【问题讨论】:

  • 也许您忘记(在创建序列后)将其附加到 geo_section.gid ? ALTER TABLE ONLY geo_section ALTER COLUMN gid SET DEFAULT nextval('geo_section_gid_seq'::regclass); ALTER SEQUENCE geo_section_gid_seq OWNED BY geo_section.gid;

标签: postgresql primary-key sequence postgresql-9.4


【解决方案1】:

要更改序列的下一个值,请使用 setval 函数:

     select setval('geo_section_gid_seq'::regclass,34503,false)

false : 如果你想要下一个值是 34503

true : 如果你想要下一个值是 34504

【讨论】:

    【解决方案2】:

    你应该执行这个命令:

    SELECT setval('geo_section_gid_seq', (SELECT MAX(gid) FROM 'geo_section'), true)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-25
      • 2013-06-29
      • 2018-12-23
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 1970-01-01
      • 2017-08-10
      相关资源
      最近更新 更多