Postgresql插入 - 自动获取下一个ID?

4
我正在使用IntelliJ和数据库工具。我的一些数据出了问题,所以我删除了一行,但后来又想添加几行... 我使用了克隆选项:

enter image description here

我随后修改了我的值并点击了提交按钮。
然而,插入失败并显示以下错误:

ERROR: duplicate key value violates unique constraint "Primary Key some_table" Detail: Key (id)=(58) already exists.

我之后尝试通过控制台手动插入,但是我得到了相同的错误。 每次这样做时,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...);

但我收到了相同的错误信息...

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

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

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

5个回答

7

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

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

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

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


0

如果您知道应该是什么,还有另一种将其重置为所需内容的方法,具体操作如下:"alter sequence schema.table_id_seq restart with xx"(其中xx是下一个可用数字)。此方法适用于12.x和13.x版本,其中schema是您模式的名称,table是您表的名称!


0

好的,我找到了问题所在...

我之前克隆了表格,这也克隆了序列。这就是问题所在:在some_tableid列中的默认值使用了来自旧的克隆表格的序列...

我修改了序列名称以使用新的序列,然后它就可以工作了。

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

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

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

感谢大家的帮助。我们学到了一个教训:不要克隆表;不要偷懒。


0

您可以在插入时跳过列名,或使用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)

我已经更新了我的帖子 - 我尝试了那两种方法,但遗憾的是,都不起作用。 - pookie
2
实际上,看起来他确实在使用序列(考虑到每个错误消息中都有递增的值),但它落后于已插入数据库中的内容,因为可能有一些插入了手动指定PK的值,导致序列未被使用。 - Łukasz Kamiński
@ŁukaszKamiński 是的,似乎有一个序列。请查看更新后的问题。 - pookie
@ŁukaszKamiński 谢谢您的提醒!我一直在回答 OP 的问题,却忽略了实际的问题。 - Vao Tsun
@ŁukaszKamiński 只有我在使用数据库。记录是通过一个虚拟机插入的,现在我正在尝试在另一个虚拟机上手动插入记录。我没有触碰过ID - 不知道重置序列意味着什么,它包含什么或者会产生什么影响。 - pookie
显示剩余2条评论

-2
你可以尝试这个,
 cur.execute("SELECT * FROM Employee_Activity")
    rows = cur.fetchall()
    for row in rows:
       val_id=(row[0])
    val_id+=1 

val_id 可以自动获取并递增


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接