【问题标题】:Postgresql INSERT - auto get next id?Postgresql INSERT - 自动获取下一个ID?
【发布时间】:2017-08-03 11:21:49
【问题描述】:

我正在使用 IntelliJ 和数据库工具。我遇到了一些数据问题,所以我删除了一行,但又想再添加几行...

我使用了克隆选项:

然后我修改了我的值并点击了commit 按钮。

但是,插入失败并出现错误:

错误:重复键值违反唯一约束“主键 some_table”详细信息:键 (id)=(58) 已存在。

然后我尝试通过控制台手动插入,但我得到了同样的错误。 每次执行此操作时,id 都会增加...我有数千条记录,因此在手指折断之前我无法继续单击。

这是id 的样子(创建表时):

id bigserial not null constraint "Primary Key some_table"
primary key

当我尝试修改表格时,我看到 id 的默认值设置如下:

nextval('some_table_id_seq'::regclass)

我试过了:

INSERT INTO some_table (id,...columns..) VALUES (DEFAULT,...columns...);

INSERT INTO some_table (...columns..) VALUES (...columns...);

但我得到了同样的错误......

我意识到我可以做一些事情 like 运行查询以获取 MAX id然后 做我的插入,但这对我来说似乎有点荒谬。

如何调整我的INSERT,使其自动获取新的/下一个id

例如,MSSQL 已使用newid() 自动为您处理此问题。

【问题讨论】:

    标签: postgresql intellij-idea


    【解决方案1】:

    如果您的序列与基础数据不同步(由于手动输入的记录或来自错误序列的 id),您可以使用以下命令重置它们:

    SELECT SETVAL('some_table_id_seq',MAX(id)+1) FROM some_table
    

    这只是找到当前表中的最高 ID,然后将序列更新为下一个可用值。

    文档:https://www.postgresql.org/docs/current/static/functions-sequence.html

    【讨论】:

      【解决方案2】:

      您可以在插入时跳过列列表中的列,也可以使用 DEFAULT 关键字,如下所示:

      t=# create table i (i bigserial, t text);
      CREATE TABLE
      Time: 99.579 ms
      t=# insert into i (t) select null;
      INSERT 0 1
      Time: 75.390 ms
      t=# insert into i values(DEFAULT,null);
      INSERT 0 1
      Time: 58.365 ms
      t=# select * from i;
       i | t
      ---+---
       1 |
       2 |
      (2 rows)
      

      【讨论】:

      • 我已经更新了我的帖子 - 我已经尝试了这两种方法,但不幸的是,两者都不起作用。
      • 实际上看起来他实际上是在使用序列(考虑到他在每条错误消息中都获得了递增的值),但它落后于已经插入数据库的内容,因为可能是手动指定的插入值PK 和剩下的序列未使用。
      • @pookie 如果您的序列落后于实际值,您当然可以轻松重置它 - 但首先要确定谁在序列上方插入值
      • @ŁukaszKamiński 是的,似乎有一个序列。请查看更新后的问题。
      • @ŁukaszKamiński 感谢您的通知!我在回答 OP 的问题,却忽略了实际问题
      【解决方案3】:

      好的,我知道问题出在哪里了……

      之前克隆了表,然后它也克隆了序列。这就是导致问题的原因:some_tableid 列中的默认值使用的是 OLD 克隆表中的序列...

      我修改了序列名称以使用新序列,并且它起作用了。

      另外,在进行插入时,您可以替换使用:

      INSERT INTO some_table (id,...columns..) VALUES (nextval('some_table_id_seq'::regclass),...columns...);
      

      自动生成id(与引用DEFAULT相同)

      感谢大家的帮助。经验教训:不要克隆表;不要偷懒。

      【讨论】:

        【解决方案4】:

        如果您知道它应该是什么,还有另一种方法可以将它重置为您想要的,如下所示:“alter sequence schema.table_id_seq restart with xx”(其中 xx 是下一个可用数字)。这适用于 12.x 和 13.x,schema 是您的 schema 的名称,table 是您的表的名称!

        【讨论】:

          【解决方案5】:

          你可以试试这个,

           cur.execute("SELECT * FROM Employee_Activity")
              rows = cur.fetchall()
              for row in rows:
                 val_id=(row[0])
              val_id+=1 
          

          val_id 可以自动获取和递增

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-10-08
            • 2011-10-09
            • 2020-01-29
            • 2013-09-01
            • 2016-01-08
            • 2010-11-25
            相关资源
            最近更新 更多