在向PostgreSQL表中插入新记录时如何调用序列?

86

如何在向表中插入新行时调用postgresql序列?

我想执行类似于以下操作:

insert into biz_term(
  biz_term_id, 
  biz_term_name, 
  ) 
values(SELECT nextval(idsequence)',
'temp'
);

我的目的是想在往 biz_term 表中插入新记录时直接调用序列 idsequence,请问如何调用?

2个回答

166

你基本上已经做到了。你不需要在里面加上SELECT:

insert into biz_term(
  biz_term_id, 
  biz_term_name, 
) 
values(
 nextval('idsequence'),
 'temp'
);

为什么您没有将指定为serial(或bigserial),这样可以自动处理?


回答你的问题 - 我使用这种技术是因为我希望我的串行号码从一个表格继续计数到另一个表格。 - Ely Fialkoff
什么是'idsequence'?抛出“不存在”的异常。 - JMess
@JMess:它是问题中使用的序列名称。显然,如果您的序列有不同的名称,则需要使用该名称。 - user330315

3
尽管这是一个有点陈旧的话题,但我想指出一个选择 BIGINT 而不是 BIGSERIAL 的好理由,那就是如果你正在使用 Hibernate。以下是文章:
https://vladmihalcea.com/postgresql-serial-column-hibernate-identity/ 正如文章所指出的,

使用 SEQUENCE 生成器是一个更好的替代方案,因为可以在执行 INSERT 语句之前生成标识符。

发布一个答案,因为我还没有资格发表评论 :/。提前道歉,如果您觉得不合适的话。

bigserial 使用序列来生成值。 - user330315
确实如此。但是,对于bigserial的值,Hibernate将无法使用,因为在bigserial的情况下,bigserial是在数据库中生成的 - 因此对Hibernate不可见!在Postgres中使用bigserial与使用identity(auto_increment)相同,关于Hibernate也是如此。因此,建议在数据库中使用big int,并在Hibernate中使用生成器并使用“true”序列。我留下了一个链接,你可能更好地理解我的意思。 - constantine-d
好吧,Hibernate 可以简单地使用序列后面的 nextval(),但我猜这对于一个混淆层来说太过苛求了。使用(本地)序列比混淆层自己实现的任何东西都更有效、可扩展和并发安全。 - user330315
据我所知,本地序列是指在数据库中存储序列时拥有的那个序列。如果我对此有误,请纠正我。在我之前的评论中,我试图表达的是,Hibernate“更喜欢本地序列”,意思是当我们使用本地序列时,Hibernate将使用nextval()! :) 如果我们使用的是bigserial或者不是本地序列的serial,则Hibernate将不会使用nextval()。 - constantine-d

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