web-dev-qa-db-ja.com

現在(クエリの実行時)のシーケンス値を取得するオプション

Postgresql 8.4で現在のシーケンス値を取得するにはどうすればよいですか?

注:何らかの統計の値が必要です。取得して保存するだけです。手動でインクリメントする場合、並行性と競合状態に関連するものはありません。質問には関係ありません。

注2:シーケンスは複数のテーブルで共有されます

注3:currvalは次の理由で機能しません。

  • 現在のセッションでこのシーケンスのnextvalによって最後に取得された値を返します
  • ERROR: currval of sequence "<sequence name>" is not yet defined in this session

私の現在のアイデア:DDLを解析することです。これは奇妙です

39
zerkms

次を使用できます。

SELECT last_value FROM sequence_name;

Update:これは CREATE SEQUENCE ステートメントに記載されています:

シーケンスを直接更新することはできませんが、次のようなクエリを使用できます。

SELECT * FROM name;

シーケンスのパラメーターと現在の状態を調べる。特に、シーケンスのlast_valueフィールドには、セッションによって割り当てられた最後の値が表示されます。 (もちろん、他のセッションがnextval呼び出しをアクティブに実行している場合、この値は出力される時点で廃止される可能性があります。)

76
Daniel Vérité

シーケンスがテーブル内の一意のIDに使用されている場合、これを簡単に行うことができます。

_select max(id) from mytable;
_

最も効率的な方法は、postgres固有ですが、次のとおりです。

_select currval('mysequence');
_

技術的には、これはnextval('mysequence')の呼び出しによって生成された最後の値を返しますが、これは必ずしも呼び出し側によってsedであるとは限りません(未使用の場合、自動インクリメントID列にギャップが残ります) 。

1
Bohemian