gpt4 book ai didi

postgresql - 如何找出一个序列是否在这个 session 中被初始化?

转载 作者:行者123 更新时间:2023-11-29 11:27:20 28 4
gpt4 key购买 nike

我需要在函数中读取序列的当前值。但是,在每次 session 中我第一次尝试使用 currval() 时,出现以下错误:

currval of sequence "foo_seq" is not yet defined in this session

提示那些可能通过谷歌搜索此错误而发现此问题的人:您需要通过 nextval() or setval() 为每个 session 初始化序列。 .

我可以使用 lastval() 甚至 setval('your_table_id_seq', (SELECT MAX(id) FROM your_table)); 之类的东西相反,但这似乎要么容易出现差距,要么比简单的 currval() 慢。我的目标是避免差距和不一致(我知道一些值将被手动添加),因此在逻辑处理它们之前使用 nextval() 对我的目的来说并不理想。无论如何我都需要它来初始化 session 的序列,但我更愿意做这样的事情:

--start of the function here
IF is_not_initialized THEN
SELECT setval('foo_seq', (SELECT MAX(id) FROM bar_table)) INTO _current;
ELSE
SELECT currval('foo_seq') INTO _current;
END IF;
--some magic with the _current variable and nextvalue() on the right position

重点是我完全不知道“is_not_initialized”是什么样子以及是否可能。是否有任何功能或其他技巧可以做到这一点?

编辑:实际上,我的计划是让每组客户在正确的顺序、根本没有顺序和我现在要求的奇怪的“类似顺序的东西”之间做出选择。即使客户想要这样一个奇怪的序列,它也只会用于需要它的列——通常是因为有一些模拟数据,我们需要将它们的键(通常几乎没有间隙的序列)存储到数据库中以实现向后兼容。

无论如何,你是对的,这不是一个合适的解决方案,而且在这些情况下,没有比这种困惑的解决方法更好的顺序了,所以我会再次考虑(并与客户讨论)是否真的需要它。

最佳答案

Craig、a_horse 和 pozs 提供的信息可以帮助您理解使用序列的原则。除了您将如何使用它的问题之外,这里还有一个函数,如果它已被初始化则返回序列的当前值,否则返回 null。

如果序列 seq 尚未初始化,currval(seq) 会引发异常,sqlstate 55000。

create or replace function current_seq_value(seq regclass)
returns integer language plpgsql
as $$
begin
begin
return (select currval(seq));
exception
when sqlstate '55000' then return null;
end;
end $$;

select current_seq_value('my_table_id_seq')

关于postgresql - 如何找出一个序列是否在这个 session 中被初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24182521/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com