Postgres每个事务增加SERIAL列

时间:2015-03-31 14:02:24

标签: postgresql

如果我理解SERIAL正确键入,则如果没有为每个INSERT语句指定值,则会自动递增。我想知道每组INSERT甚至每笔交易是否可以自动增加一次。

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

1 个答案:

答案 0 :(得分:0)

您可以使用@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());