我需要读取函数中序列的当前值。但是,在每个会话中我第一次尝试使用 currval() 时,出现以下错误:
currval of sequence "foo_seq" is not yet defined in this session
提示那些可能通过谷歌搜索此错误找到此问题的人:您需要初始化每个会话的序列,可以通过nextval() 或 setval() http://www.postgresql.org/docs/8.1/static/functions-sequence.html.
我可以用类似的东西lastval()
甚至setval('your_table_id_seq', (SELECT MAX(id) FROM your_table)); https://stackoverflow.com/a/244265/1801588相反,但这似乎要么容易出现间隙,要么比简单的慢currval()
。我的目标是避免间隙和不一致(我知道一些值将手动添加),因此在逻辑处理它们之前使用 nextval() 对于我的目的来说并不理想。无论如何,我需要它来初始化会话的序列,但我更喜欢这样做:
--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”是什么样子以及是否可能。有什么功能或其他技巧可以做到这一点吗?
编辑:实际上,我的计划是让每组客户在正确的序列、根本没有序列和我现在要求的奇怪的“类似序列的东西”之间进行选择。即使客户想要这样一个奇怪的序列,它也只会用于需要它的列 - 通常是因为有一些模拟数据,我们需要将它们的密钥(通常几乎无间隙序列)存储到数据库中以实现向后兼容性。
不管怎样,你是对的,这不是正确的解决方案,而且在这些情况下,没有任何顺序可能比这种混乱的解决方法更好,所以我会再次思考(并与客户讨论)是否真的需要它。