🔖

PostgreSQLでAUTO_INCREMENTをリセットする方法【MySQLとの違いに注意】

に公開

はじめに

MySQLを使っていると、
次のようにAUTO_INCREMENTをリセットすることがあります。

ALTER TABLE users AUTO_INCREMENT = 1;

しかし、PostgreSQLで同じように実行するとエラーになります。

私自身、初めてPostgreSQLを使ったとき、ここでつまずきました。

この記事では、
なぜエラーになるのか?
PostgreSQLではどうやってリセットするのか?
その理由と解決方法を解説します。

MySQLの場合

MySQLでは、次のように実行するだけで、
ID(AUTO_INCREMENT)をリセットできます。

ALTER TABLE users AUTO_INCREMENT = 1;

これだけで、次に追加されるデータのIDが1から始まります。
とてもシンプルでした。

PostgreSQLの場合

PostgreSQLで同じコマンドを実行しようすると、

※補足
PostgreSQLには、実際には「AUTO_INCREMENT」という仕組みは存在しません。
この記事では、MySQL経験者の方が違いを理解しやすいように便宜上「AUTO_INCREMENT」という言葉を使っています。
PostgreSQLでは、IDの自動採番は「シーケンス(sequence)」という仕組みで管理されています。

ALTER TABLE users AUTO_INCREMENT = 1;

次のようなエラーになります。

ERROR: syntax error at or near "AUTO_INCREMENT"

理由は、
PostgreSQLにはAUTO_INCREMENTという仕組み自体がないためです。

PostgreSQLはシーケンスで管理している

PostgreSQLにおいて、
IDの自動採番は シーケンス(sequence) と呼ばれる仕組みで管理されています。

シーケンスとは、

次に使用する番号を順番に提供してくれる、テーブルとは別に存在する部品

のようなものです。

以下のようなイメージです。

データベース
├── users(テーブル)
│     ├── id(カラム)
│     ├── name(カラム)
│     └── email(カラム)
│
├── users_id_seq(シーケンス)
  • users というテーブルとは別に、
  • users_id_seq というシーケンスが独立して存在し、
  • IDカラムはそこから番号をもらっています。

そのため、MySQLのように
ALTER TABLE ... AUTO_INCREMENT = 1;
というやり方ではなく、
「シーケンス自体」を操作して番号をリセットする必要があります。

※この記事ではシーケンスの仕組みそのものには深入りしませんが、
「PostgreSQLではテーブルとシーケンスは別に存在している」というイメージを持っておくと安心です。

正しいリセット方法(PostgreSQL版)

PostgreSQLでIDをリセットするには、
シーケンス自体をリセットする必要があります。

方法は2つあります。

方法① ALTER SEQUENCE

ALTER SEQUENCE users_id_seq RESTART WITH 1;

→ 次に挿入されるIDが1になります。

方法② setval()を使う

SELECT setval('users_id_seq', 1, false);
  • 第1引数:シーケンス名
  • 第2引数:次に使いたいID
  • 第3引数:falsetrueにすると次は+1されるので注意)

まとめ

MySQL PostgreSQL
IDの仕組み AUTO_INCREMENT シーケンス(sequence)
リセット方法 ALTER TABLE ... AUTO_INCREMENT ALTER SEQUENCEまたはsetval()

おわりに

MySQLとPostgreSQLでは、
見た目は似ていても、内部の仕組みが大きく違うことがあります。

私自身、この違いを知らずエラーに戸惑いました。

本記事が参考になれば幸いです。

Discussion