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引数:
false
(true
にすると次は+1されるので注意)
まとめ
MySQL | PostgreSQL | |
---|---|---|
IDの仕組み | AUTO_INCREMENT | シーケンス(sequence) |
リセット方法 | ALTER TABLE ... AUTO_INCREMENT |
ALTER SEQUENCE またはsetval()
|
おわりに
MySQLとPostgreSQLでは、
見た目は似ていても、内部の仕組みが大きく違うことがあります。
私自身、この違いを知らずエラーに戸惑いました。
本記事が参考になれば幸いです。
Discussion