我的表中有一个列(bigint),我希望它的每个下一个值自动为之前的两倍(从一开始)。我怎么能用序列来做呢?
答案 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;