【问题标题】:Postgres increment SERIAL column per transactionPostgres 为每个事务增加 SERIAL 列
【发布时间】:2015-06-04 21:34:53
【问题描述】:

如果我正确理解SERIAL 类型,如果没有为每个INSERT 语句指定值,它会自动递增。我想知道是否可以为每组INSERTs 甚至每笔交易应用一次自动增量。

例如如果我在每个插入之后执行 3 次插入,我会在 SERIAL 列中得到 1,2,3。我想创建具有 3 个插入的单个事务并增加受影响的行,最后在这些行的 SERIAL 列中以 1,1,1 结束。如果我再这样做,我会得到2,2,2 而不是4,5,6

【问题讨论】:

  • 不能使用串行列。您可以创建一个“常规”序列,然后在事务开始时查询nextval() 的序列,然后在该事务期间的所有插入中使用currval()
  • 啊,我也很怀疑,但感谢您确认这一点。

标签: postgresql


【解决方案1】:

您可以使用@a_horse_with_no_name 描述的序列,并使用提供默认值的函数自动执行该过程。在一个事务中多次调用会返回相同的值。

CREATE SEQUENCE test_id_seq;

CREATE FUNCTION test_id_nextval() RETURNS INTEGER AS $$
DECLARE
    retval INTEGER;
BEGIN
    -- Try to fetch the current value.
    SELECT * FROM test_id_seq_temp LIMIT 1 INTO STRICT retval;
    RETURN retval;
EXCEPTION
    WHEN undefined_table THEN
        -- The function hadn't been called yet during this transaction.
        -- Create a temporary table for the next value of the sequence and return it.
        CREATE TEMPORARY TABLE test_id_seq_temp ON COMMIT DROP AS SELECT nextval('test_id_seq');
        SELECT * FROM test_id_seq_temp LIMIT 1 INTO STRICT retval;
        RETURN retval;
END;
$$ VOLATILE LANGUAGE plpgsql;

CREATE TABLE test (id INTEGER DEFAULT test_id_nextval());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-16
    • 2016-08-22
    • 1970-01-01
    • 2021-03-27
    • 2016-07-14
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    相关资源
    最近更新 更多