[PostgreSQL]TRUNCATE でシーケンスもリセットする

1. TRUNCATE によるシーケンスリセット

テーブルを空にするために TRUNCATE を使用する。

TRUNCATE TABLE <table_name>;

PostgreSQL では、テーブルが空になるのみで、シーケンス番号が保持されたままとなる。

シーケンス番号もリセットしたい場合は、 RESTART IDENTITY を付加する必要がある。

TRUNCATE TABLE <table_name> RESTART IDENTITY;

2. シーケンス番号がリセットされない場合

テーブルの作り方によってはシーケンス番号がリセットされない場合がある。

その場合は、シーケンスの現在値を設定しなければならない。

select * from <sequence_name>;

で表示される last_value がシーケンスの現在値。

select setval ('<sequence_name>', 1, false);

とすると、シーケンスの現在値が設定され、 1 から振られるようになる。

3番目のパラメータを false にしないと2番目のパラメータで指定した数値の次の値から振られるようになってしまうので注意。

2.1. データベースの users テーブルの例

現在のシーケンス番号確認
=# select * from users_id_seq;
 sequence_name | last_value | start_value | increment_by | max_value  | min_value | cache_value | log_cnt | is_cycled | is_called
---------------+------------+-------------+--------------+------------+-----------+-------------+---------+-----------+-----------
 users_id_seq  |         63 |           1 |            1 | 2147483647 |         1 |           1 |      32 | f         | t
(1 )
設定
=# select setval ('users_id_seq', 1, false);
 setval
--------
      1
確認
=# select * from users_id_seq;
 sequence_name | last_value | start_value | increment_by | max_value  | min_value | cache_value | log_cnt | is_cycled | is_called
---------------+------------+-------------+--------------+------------+-----------+-------------+---------+-----------+-----------
 users_id_seq  |          1 |           1 |            1 | 2147483647 |         1 |           1 |       0 | f         | f

last_value1 となっている。