2025.05.07(更新日: 2025.05.07)
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_called
が true
になると、「設定した値 + 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
を使って状態を確認するのがポイント。
コメントを残す