[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_value
が 1
となっている。