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