我们有一张桌子,我们向消费者展示了一个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
答案 0 :(得分:1)
Postgres每次都会为序列生成新的ID。您可能会因回滚等原因而在序列中出现间隙,但如果这不重要,那么您应该好好去。
您应该使用nextval
来获取新值。 currval
报告上次生成的值。
序列文档。 https://www.postgresql.org/docs/current/static/sql-createsequence.html
答案 1 :(得分:1)
我宁愿使用nextval
来前滚该值并将其返回。
关于您的问题 - 将nextval
用于多个并发事务是safe:
避免阻止从中获取数字的并发事务 相同的顺序,nextval操作永远不会回滚;就是一次 已获取一个值,它被认为是使用的,不会被使用 又回来了。即使周围的交易稍后也是如此 中止,或者如果调用查询最终没有使用该值。