在postgres中获取主键序列号

Getting primary key sequence number in postgres

我们有一个 table,我们在其中向我们的消费者公开一个 ShortID,它生成一个类似 Youtube 的标识符(深受 this SO post 的启发)。我们使用行的主 KEY 来生成它(在视图中)。例如

SELECT title,description,imageuri,generateseoid(id)as seo FROM broadcastimage WHERE...

generateseoid 函数本质上是在进行 stringify_bigint 调用(来自上面的 SO 答案)并进行了一些小的更改。

我们需要在插入时执行此操作。像这样获取值是否安全:

generateseoid(currval(pg_get_serial_sequence('broadcastimage', 'id')))

在插入调用中?我们有很多线程(通过 AWS 中的 SQS 队列)将记录插入广播流 table。我有点担心使用多个 postgres 连接时,我们会生成相同的序列号。该列上有一个 UNIQUE CONSTRAINT。

另一种方法是向其中添加另一个 random() 数字吗?

编辑:

这是一个测试 nextval 与 currval 的简单示例:

CREATE TABLE test (
  id serial PRIMARY KEY,
  text text
)
  insert into test (text) VALUES ('test ' || nextval(pg_get_serial_sequence('test ', 'id')))
  insert into test (text) VALUES ('test ' || currval(pg_get_serial_sequence('test ', 'id')))

select * From test

结果指向:

1 | test 2
3 | test 3

Postgres 每次都会为序列生成新的 ID。您可能会因回滚等原因在序列中出现间隙,但如果这不重要,那么您应该可以开始了。

您应该使用 nextval 来获取新值。 currval 报告最后生成的值。

序列文档。 https://www.postgresql.org/docs/current/static/sql-createsequence.html

我宁愿使用 nextval 前滚该值并 return 它。

关于您的问题 - safenextval 用于多个并发事务:

To avoid blocking concurrent transactions that obtain numbers from the same sequence, a nextval operation is never rolled back; that is, once a value has been fetched it is considered used and will not be returned again. This is true even if the surrounding transaction later aborts, or if the calling query ends up not using the value.