PostgreSQL耗尽序列时的错误类型是什么?

PostgreSQL耗尽序列时的错误类型是什么?,postgresql,Postgresql,我想使用PostgreSQL序列在数据库中生成主键。它不是一个大的序列,而是分成几个小部分(关键序列)(这与客户端脱机工作和稍后同步工作有关) 我已经编写了一个表,其中包含下一个要发布的密钥序列,以及一个函数,该函数将发布一个新的序列并更新密钥序列。如果没有设置主键,我现在将触发将主键附加到插入的行 当密钥序列用尽时,如何捕获?需要捕获什么异常?我想这样做: create or replace function generate_key() returns trigger as $$ begin

我想使用PostgreSQL序列在数据库中生成主键。它不是一个大的序列,而是分成几个小部分(关键序列)(这与客户端脱机工作和稍后同步工作有关)

我已经编写了一个表,其中包含下一个要发布的密钥序列,以及一个函数,该函数将发布一个新的序列并更新密钥序列。如果没有设置主键,我现在将触发将主键附加到插入的行

当密钥序列用尽时,如何捕获?需要捕获什么异常?我想这样做:

create or replace function generate_key() returns trigger as
$$
begin
    if new._id is null then
       begin
           new._id = nextval(key_sequence);
       exception when SEQUENCE_EXHAUSTED then
           perform update_key_sequence();
           new._id = nextval(key_sequence);
       end; 
    end if;
    return new;
end;
$$
language plpgsql;

我在谷歌上搜索失败,并在一个迷你序列上进行了尝试,但所做的只是给出了一个不明确的“错误”

非常容易通过以64位有符号整数的最大值启动序列来测试这一点:

regress=> CREATE SEQUENCE xx START WITH 9223372036854775807;
CREATE SEQUENCE
regress=> \set verbosity verbose
regress=> SELECT nextval('xx');
       nextval       
---------------------
 9223372036854775807
(1 row)
regress=> SELECT nextval('xx');
ERROR:  55000: nextval: reached maximum value of sequence "xx" (9223372036854775807)
LOCATION:  nextval_internal, sequence.c:644
所以,
SQLSTATE
55000。也许不是世界上最有用的错误


序列的显式
MAXVALUE
也会产生同样的错误,同样容易测试。

以64位有符号整数的最大值开始序列,很容易测试出来:

regress=> CREATE SEQUENCE xx START WITH 9223372036854775807;
CREATE SEQUENCE
regress=> \set verbosity verbose
regress=> SELECT nextval('xx');
       nextval       
---------------------
 9223372036854775807
(1 row)
regress=> SELECT nextval('xx');
ERROR:  55000: nextval: reached maximum value of sequence "xx" (9223372036854775807)
LOCATION:  nextval_internal, sequence.c:644
所以,
SQLSTATE
55000。也许不是世界上最有用的错误


序列的显式
MAXVALUE
也会产生同样的错误,同样很容易测试。

我想说sqlstate 55000
object\u not\u in\u prerequisite\u state

在9.2上试用:

CREATE SEQUENCE "seq_try_max_100"
    INCREMENT BY 10
    MAXVALUE 100
    START WITH 99 NO CYCLE;

SELECT nextval('seq_try_max_100');
SELECT nextval('seq_try_max_100');

-- shows:

ERROR: nextval: reached maximum value of sequence "seq_try_max_100" (100)
SQL state: 55000


我想说sqlstate 55000
object\u not\u in\u prerequisite\u state

在9.2上试用:

CREATE SEQUENCE "seq_try_max_100"
    INCREMENT BY 10
    MAXVALUE 100
    START WITH 99 NO CYCLE;

SELECT nextval('seq_try_max_100');
SELECT nextval('seq_try_max_100');

-- shows:

ERROR: nextval: reached maximum value of sequence "seq_try_max_100" (100)
SQL state: 55000

,此场景中的错误代码已更改为更具信息性的
2200H
序列\u生成器\u限制\u超出了

mydb=> \set VERBOSITY verbose
mydb=> INSERT INTO test_table VALUES ('x');
ERROR:  2200H: nextval: reached maximum value of sequence "test_id_seq" (4)
LOCATION:  nextval_internal, sequence.c:707
,此场景中的错误代码已更改为更具信息性的
2200H
序列\u生成器\u限制\u超出了

mydb=> \set VERBOSITY verbose
mydb=> INSERT INTO test_table VALUES ('x');
ERROR:  2200H: nextval: reached maximum value of sequence "test_id_seq" (4)
LOCATION:  nextval_internal, sequence.c:707

谢谢,效果很好。奇怪的是,即使我做了
\set verbosity verbose
psql仍然没有显示sqlstate o.OCase-sensitive<代码>冗长。我不相信这是命中注定的。再也不相信了,请看我的回答:谢谢,效果很好。奇怪的是,即使我做了
\set verbosity verbose
psql仍然没有显示sqlstate o.OCase-sensitive<代码>冗长。不相信这是命中注定的。不再,看我的答案:不再,看我的答案:不再,看我的答案: