【发布时间】:2021-08-17 22:16:27
【问题描述】:
当前我在查找列的下一个序列值时遇到问题。
my_list 表由以下人员创建
CREATE SEQUENCE my_list_id_seq;
CREATE TABLE IF NOT EXISTS
my_list (id int PRIMARY KEY UNIQUE NOT NULL DEFAULT nextval('my_list_id_seq'),
mycardno);
ALTER SEQUENCE my_list_id_seq OWNED BY my_list.id;
我尝试使用 currval 查询来查找下一个序列值(应该是 1)但我得到了
SELECT currval('my_list_id_seq');
ERROR: currval of sequence "my_list_id_seq" is not yet defined in this session
如果我使用 nextval 查询,我将得到 2,这不是我想要的,并且该查询的序列将增加 1。
SELECT nextval('my_list_id_seq');
nextval
---------
2
(1 row)
在 nextval 查询之后,我现在可以使用 currval 查询。
SELECT currval('my_list_id_seq');
currval
---------
2
(1 row)
由于现阶段我找不到其他解决方案,目前我的步骤是
- 执行 nextval 并获取“下一个序列”值
- 使用
ALTER SEQUENCE my_list_id_seq RESTART WITH "next sequence - 1";设置回序列值。 “下一个序列 - 1”由 C# 完成(我使用 WPF)。
我想知道这个问题是否有直接的方法。谢谢。
【问题讨论】:
-
您已经得到了如何获取当前值的答案,但是您需要它做什么?您不能假设在插入下一条记录之前,您获得的值不会增加。此外,如果交易失败,该值甚至会增加,您将在
id列中出现空白。 -
创建序列后,当你调用
nextval()时,你不会得到2,而是1。所以我不太明白你的问题是什么。 -
听起来你永远不需要序列的值。试着解释你的目标,你的第二张桌子看起来如何(简化)。将这些详细信息放在您的问题中,而不是在 cmets 中。
-
@testcb00 请edit您的问题并添加所有这些解释
-
@a_horse_with_no_name 我编辑了,但是我的问题被richyen的解决方案解决了。我想要的只是从 my_list_id_seq 获取当前值和 last_value 列来完成这项工作。
标签: postgresql