postgresql – 如何确定序列是否在此会话中初始化?

postgresql – 如何确定序列是否在此会话中初始化?,第1张

概述我需要读取函数中序列的当前值.但是,在每个会话中我第一次尝试使用currval(),我得到以下错误: currval of sequence "foo_seq" is not yet defined in this session 提示那些可能通过Google搜索此错误找到此问题的人:您需要初始化每个会话的序列,或者是nextval() or setval(). 我可以使用类似lastval()甚 我需要读取函数中序列的当前值.但是,在每个会话中我第一次尝试使用currval(),我得到以下错误:

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

提示那些可能通过Google搜索此错误找到此问题的人:您需要初始化每个会话的序列,或者是nextval() or setval().

我可以使用类似lastval()甚至setval('your_table_id_seq',(SELECT MAX(id) FROM your_table));的东西,但这似乎要么容易出现间隙,要么比简单的currval()慢.我的目标是避免间隙和不一致(我知道一些值将手动添加),因此在逻辑处理它们之前使用nextval()并不适合我的目的.我还需要这个来初始化会话的序列,但我更喜欢这样做:

--start of the function hereIF 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”是什么样子,以及它是否可能.有没有任何功能或其他技巧呢?

编辑:实际上,我的计划是让每一组客户在正确的序列,完全没有序列,以及我现在要求的奇怪的“类似序列”之间进行选择.即使客户想要这样一个奇怪的序列,它也只能用于需要它的列 – 通常是因为有一些模拟数据,我们需要将它们的密钥(通常几乎无间隙的序列)存储到DB中以便向后兼容.

无论如何,你是对的,这不是正确的解决方案,并且在这些情况下没有顺序可能比这种凌乱的解决方案更好,所以我会再次考虑(并与客户讨论)是否真的需要它.

解决方法 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 – 如何确定序列是否在此会话中初始化?全部内容,希望文章能够帮你解决postgresql – 如何确定序列是否在此会话中初始化?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/1161799.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存