1. HOME
  2. システム開発
  3. 〜YABAI〜 phpMyAdmin からの AUTO_INCREMENT 値のリセット方法
システム開発

〜YABAI〜 phpMyAdmin からの AUTO_INCREMENT 値のリセット方法

システム開発

3721

AUTO_INCREMENTの値がヤバイ

先日、とある会員制システムが動いているサーバーを数年ぶりに再起動しました。作業翌日、MySQLデータベースをふと見て見ると、新規会員登録したユーザに自動付与される会員IDがとんでもない数値になっているではありませんか。

—–再起動前に自動付与されている会員ID—–
1024
1025
1026
1027

こんなかんじだったのが、

—–再起動後に自動付与された会員ID—–
1000000000
1000000001
1000000002
1000000003

と、とんでももない会員IDが自動付与されてしまっていました。ほげー。会員ID のカラムは、AUTO_INCREMENT が設定されています。その AUTO_INCREMENT の値が 1000000000 以上に変更されていたようです。phpMyAdmin から AUTO_INCREMENT の値を 1028 と設定しなおしても、設定は反映されません。
ALTER TABLE “テーブル名” AUTO_INCREMENT = 1028;
と MySQL からコマンドを打ってもやっぱり症状は変わりません。
しかし実害はないし、エンジニア以外にはバレないのでこのまま放置しようかとも思いましたが、それではプロと言えますまい。調査・修正をおこなうことにしました。

原因は既存レコードの会員ID

そういえば、既存システムの改修の中で、999999999 の会員IDを持つ特別なレコードがあることを思い出しました。どうもこいつが悪さをしているようです。既存レコードの会員IDの最大値が999999999 であるため、AUTO_INCREMENT をいくらリセットしても、その次の数値である 1000000000 が会員IDになってしまうのでした。AUTO_INCREMENT はその性質上、既存のデータ以下の値に設定することができません。

phpMyAdmin の操作のみで AUTO_INCREMENT をリセット

原因が分かればあとは簡単です。会員ID 999999999 のレコードを一旦削除し、AUTO_INCREMENT の値を設定しなおしてあげます。
コマンドラインでの修正方法はいろんなサイトにありますので、今回はより簡単な、phpMyAdmin での修正方法をご紹介したいと思います。

1. phpMyAdmin より、該当テーブルを開きます。
2. 大きな会員IDが設定されているレコードの、”編集” ボタンをクリックします。
3. 会員ID を一旦小さな値に変更し、[実行] ボタンをクリックします。
   int 型の場合は、”-1″ (マイナス1)とすると既存レコードの会員IDと重複しないのでオススメです。
4. 上部の [操作] タブより、AUTO_INCREMENT 欄に設定したい値を入力し、[実行] をクリックします。
5. その後、3で変更した AUTO_INCREMENT の値を元にもどします。

以上になります。これで、大きな会員IDを持つ特殊なレコードを保持しつつ、自動付与される ID は設定した AUTO_INCREMENT 値以降のものとなりました!

今後の課題

この対処をしても、またデータベースが再起動されると同様の事象が発生してしまいます。その都度手動で同様の修正作業をおこなうというのは、運用面に問題のあるシステムと言わざるを得ません。会員ID の非常に大きな特殊なアカウントを内部に持つというのは、設計に不備がある気がします。是非とも修正したい部分ですね。
すぐ思いつくのは、特殊な会員IDを非常に大きな数値にするのではなく、”-1″ など負の数にする方法でしょうか。エンジニアの感だと、それはそれで別な問題が発生するような予感がしますね。
SQL アンチパターンを読み終えてから考えよう・・・。