開発メモ,主に補足by子連れ親父プログラマー

2010-10-25

postgreSQLで通し番号(シーケンス)をリセットする時に1から始めたい場合

postgreSQL で id とかのフィールドで自動的に番号が増えていく、auto_increment みたいな設定をテーブルにすると、シーケンスが作られる。
例えばこんなテーブルを作ると
CREATE TABLE users(
  id SERIAL PRIMARY KEY,
  name VARCHAR(255)
);
こんなんなる。
 Schema |     Name     |   Type   |  Owner
--------+--------------+----------+----------
 public | users        | table    | postgres
 public | users_id_seq | sequence | postgres
しばらく users にデータをインサートした後で、
このシーケンスに対してセレクトをかけると、
SELECT * FROM users_id_seq ;
こんな結果が返ってくる
 sequence_name | last_value | increment_by |      max_value      | ・・・
---------------+------------+--------------+---------------------+-------
 users_id_seq  |         34 |            1 | 9223372036854775807 | ・・・
この last_value というのが自動で増えていった id の最後の番号で、これが34になったまま、 users テーブルのデータを消してしまうと、次は id が34から始まってしまう。
1からにしたい、という時に、
select setval ('users_id_seq', 1);
とやるんだが、こうすると last_value が1になるので、次は2からになってしまう。
じゃあ、
select setval ('users_id_seq', 0);
としてみたらどうかと思うが、これはエラーになる。

ということでこうするとよい。
select setval ('users_id_seq', 1, false);

一回目は last_value は1のままで、is_called が true になり、二回目は last_value は2になる。

このブログを検索

Powered by Blogger.

ラベル

php (17) jQuery (13) OSX (10) MySQL (8) Javascript (7) Postgres (7) port (7) apache (6) Java (3) Smarty (2) html (2) pear (2) FCKEditor (1) XAMPP (1) css (1) git (1) perl (1) ruby (1)

Facebookバナー