PostgreSQL一次性查询值并递增

4

我正在寻找以下问题的可能解决方案。我有一张存储特定增量数字的数据表,客户希望在数据库中跟踪该数字。这是他们在内部使用的特殊编号。

我想要做的是在选择此数字时自动递增该表中的数字。这样,我就不会遇到另一个事务(来自使用系统的其他人)使用相同的ID号码的问题。

因此,我希望一次选择当前数字并将其增加一,以便我不会有重复项。如果可能的话,我该如何做到这一点?


使用“将其增加一”时,您也想要更新现有值,对吗? - user330315
3
为什么不使用序列?http://www.postgresql.org/docs/8.1/static/sql-createsequence.html 如果没有正确开发,它不会遭受其他方法可能会遇到的数字争用问题。例如,假设两个人都去选择一个记录,如果两个人都看到“当前”是10,他们都会尝试创建11... - xQbert
更新 foo 设置 id=nextval('foo_sequence') 在哪里... 返回 * - Jonathan Hall
也可以采用另一种方法:在读取时首先选择 id 列(听起来像是一个 version_id 列)。当执行更新时,添加子句 where version_id = :selected_version_id。通过对表格进行触发器设置,在每次更新时更新 version_id,并发事务将不会发生。第二个人将更新 0 行,因为 version_id 不再匹配。您可以捕获 0 行更新状态以检测并发问题。 - Glenn
2个回答

10
UPDATE the_table
SET the_column = the_column + 1
WHERE qualifier = X
RETURNING the_column;

如果限定符返回0行,我们想在这种情况下插入计数器=1,该怎么办? - Ankur

1
这应该可以解决问题,但需要注意的是它会返回新的ID而不是旧的ID:
UPDATE foo
SET id=nextval('foo_sequence')
WHERE ...
RETURNING * 

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