获取postgres

时间:2017-04-11 12:25:47

标签: postgresql random sequences

我们有一张桌子,我们向消费者展示了一个ShortID,它会生成一个像标识符一样的Youtube(受this SO post的启发)。我们使用行的主键来生成它(在视图中)。例如

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队列)将记录插入广播流表。我有点担心,通过多个postgres连接,我们可以生成相同的序列号。该栏目中有一个独特的约束。

替代方法是在其中添加另一个random()数字吗?

编辑:

这是一个测试nextval vs 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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

我宁愿使用nextval来前滚该值并将其返回。

关于您的问题 - 将nextval用于多个并发事务是safe

  

避免阻止从中获取数字的并发事务   相同的顺序,nextval操作永远不会回滚;就是一次   已获取一个值,它被认为是使用的,不会被使用   又回来了。即使周围的交易稍后也是如此   中止,或者如果调用查询最终没有使用该值。