PostgreSQL序列,具有下一个值的特定公式

时间:2014-02-19 14:59:53

标签: database postgresql sqlalchemy

我的表中有一个列(bigint),我希望它的每个下一个值自动为之前的两倍(从一开始)。我怎么能用序列来做呢?

1 个答案:

答案 0 :(得分:0)

您无法使用SEQUENCE执行此操作。您必须生成每个值:

 BEGIN;
 LOCK TABLE mytable IN EXCLUSIVE MODE;
 INSERT INTO mytable (id, blah) VALUES ( (SELECT max(id) * 2 FROM mytable), 'blah' );
 COMMIT;

LOCK和事务块很重要,否则两个并发事务可以获得相同的值。

这是“无间隙序列”问题的变体(请参阅Google)。像那里一样,我的一般建议是:不要这样做。相反,如果您没有自然键,则使用普通序列生成ID,然后根据需要计算值。在这种情况下,double-the-previous-row与“two to the row of row number”相同,所以你可以写:

SELECT 
  id,
  2 ^ row_number() OVER (ORDER BY id) AS generated_id
FROM mytable;