PostgreSQL每个事务中增加SERIAL列的值

4
如果我正确理解SERIAL类型,那么在每个INSERT语句中如果没有指定值,它会自动递增。我想知道是否可以将自动递增应用于每组INSERT或甚至每个事务。
例如,如果我执行3次插入并在每次插入后提交,那么我将在SERIAL列中得到1,2,3。我希望创建一个包含3个插入的单个事务,并递增受影响行数,以便在这些行的SERIAL列中最终得到1,1,1。如果我再次执行此操作,我将获得2,2,2而不是4,5,6

4
不可能使用序列列。您可以创建一个“常规”序列,然后在事务开始时查询序列以获取nextval(),然后在该事务中的所有插入操作中使用currval() - user330315
啊,我早就有所怀疑了,但还是谢谢你证实了这一点。 - Alex
1个回答

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());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接