pgAdmin4でシーケンスを作成すると、TRUNCATE TABLE後に2から始まってしまう問題

はじめに

タイトルの通り、pgAdmin4でシーケンスを作成してテーブルに適用すると、初回は「1」から始まるものの、TRUNCATE TABLE 後にシーケンスを手動でリセットしても、なぜか「2」から始まってしまう現象に直面した。

今日、久しぶりのリモートワーク中にこの問題に遭遇し、思ったより時間を取られてしまったため、原因と解決策を簡潔にまとめておく。

原因

以下のSQLで現在のシーケンスの状態を確認したところ、is_calledというフラグが true になっていたことが原因だった。

SELECT last_value, is_called FROM your_sequence_name;

is_called = true の場合、nextval('your_sequence_name') を実行すると、次の値(つまり2)が返される。

初回は is_called = false のため、1から始まる

つまり、is_calledtrue になると、「設定した値 + 1」が次の値として扱われてしまう。

再現手順(例)

-- シーケンスの作成
CREATE SEQUENCE test_seq START 1;

-- 初回は1から
SELECT nextval('test_seq');  -- → 1

-- シーケンスを1にリセット
ALTER SEQUENCE test_seq RESTART WITH 1;

-- 再度取得
SELECT nextval('test_seq');  -- → 2(期待は1)

解決方法

シーケンスの削除と再作成

-- シーケンスを削除
DROP SEQUENCE test_seq;

-- 再作成
CREATE SEQUENCE test_seq START 1;

こうすることで、is_called = false の状態からやり直せるため、再び1から始まる。

GUIでシーケンスを削除することもできる(右クリック)。

まとめ

ALTER SEQUENCE RESTART WITH 1 を使っても is_called = true の場合は「2から」になってしまう。

確実に1から再スタートするには、シーケンスを一度削除して再作成する。

SELECT last_value, is_called を使って状態を確認するのがポイント。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です