如何安全地转发PostgreSQL中的主键序列?

时间:2012-02-18 14:07:50

标签: postgresql sequence

使用PostgreSQL(8.x),我需要跳过一串序列号自动,例如在给出49999之后我希望下一个id为70000而不是50000

这样做的正确/最安全的方法是什么?

注意:我最初发布了一个非常相似的问题How can I forward a primary key sequence in Django safely?,但我觉得这必须在数据库级别完成(并发问题)......

2 个答案:

答案 0 :(得分:1)

我相信我找到了一条路:

  • 不要将SERIAL用作主键,请使用DEFAULT my_next_id()
  • 遵循与“单级无间隙序列”相同的逻辑 - http://www.varlena.com/GeneralBits/130.php - my_next_id()执行更新,然后执行选择
  • 不是仅增加1,而是检查边界是否交叉,如果是,则进一步增加

答案 1 :(得分:0)

您可以使用一个触发器,它在插入语句后检查序列的实际值,并将其更改为您想要的值。

我认为这个片段应该可以胜任

CREATE OR REPLACE FUNCTION change_sequence() RETURNS TRIGGER AS $change_sequence$
DECLARE
  current_value INTEGER;

BEGIN
  current_value := currval('your_sequence');
  IF current_value = 49999 THEN
    setval ('you_sequence', 70000, false);
  END IF;
  RETURN NULL;
END;
$change_sequence$ LANGUAGE plpgsql;

-- DROP TRIGGER check_pkey ON your_table;
CREATE TRIGGER check_pkey
AFTER INSERT ON your_table
EXECUTE PROCEDURE change_sequence();