【问题标题】:How to get the next sequence value in PostgreSQL?如何在 PostgreSQL 中获取下一个序列值?
【发布时间】: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)

由于现阶段我找不到其他解决方案,目前我的步骤是

  1. 执行 nextval 并获取“下一个序列”值
  2. 使用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


【解决方案1】:

根据documentationcurrval 仅在会话中调用nextval 时有效:

返回nextval 在当前会话中为此序列最近获得的值。 (如果在此会话中从未为此序列调用过nextval,则会报告错误。)

如果要获取当前值,不妨试试SELECT * FROM my_list_id_seq 并使用last_value 列中的对应值:

postgres=# CREATE SEQUENCE my_list_id_seq;
CREATE SEQUENCE
postgres=# CREATE TABLE IF NOT EXISTS
my_list (id int PRIMARY KEY UNIQUE NOT NULL DEFAULT nextval('my_list_id_seq'),
mycardno int);
CREATE TABLE
postgres=# ALTER SEQUENCE my_list_id_seq OWNED BY my_list.id;
ALTER SEQUENCE
postgres=# select * from my_list_id_seq;
 last_value | log_cnt | is_called 
------------+---------+-----------
          1 |       0 | f
(1 row)

【讨论】:

    猜你喜欢
    • 2014-10-08
    • 2016-07-22
    • 2012-11-03
    • 2018-05-09
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多