カテゴリー別

お絵描き、デザイン

写真、動画関連ソフト

アメーバピグ専用ソフト

ホームページ関連

画像処理

スキャナー用

SEO 関連

お楽しみ

その他

過去ログ

2017年10月23日(月)

mySQL、AUTO_INCREMENT の値を設定してはダメ

結論からいうと、少なくとも mySQL では
AUTO_INCREMENT の値は設定しない方がいいです。

他の DB でもそうかもしれません。

例えば、下のような SQL で
user テーブルの AUTO_INCREMENT
の値を変更できますが、危険です。

TRUNCATE table user;
ALTER TABLE user AUTO_INCREMENT = 1001;

mySQL の環境によって挙動が変わるっぽいですが、
自分の環境だと、一定時間が経過すると、
AUTO_INCREMENT の値が、
テーブル内の ID の最大値 + 1 に
勝手に戻ってしまう現象が起こりました。

例えば、テーブルが空なら、
1 に戻っちゃいます。

ちなみに、下記のような SQL で
現在の AUTO_INCREMENT の値を確認できます。

show table status like 'user';

すなわち、上のコードを AUTO_INCREMENT
設定直後に実行すれば、きちんと設定した
値が取得できるが、しばらく時間が経つと
勝手に変わってしまう場合があるということです。

もちろん環境によっては、変化が無い場合もあるでしょうが
環境によって挙動が変わる仕組みに依存するのは間違いの元です。

では、どうすればよいのかというと、
普通に、AUTO_INCREMENT に設定したい
値 - 1 の ID で行を追加するのがよいです。

例えば、下のような SQL を発行します。

INSERT INTO user (
  user_id
)
VALUES (
  1000
);

テーブル名が、user で、
AUTO_INCREMENT する列の名前が
user_id の場合の例です。

AUTO_INCREMENT の値が 1001 より小さい場合は、
自動的に 1001 に設定されます。

AUTO_INCREMENT の値を設定してもよい場合

これまでの文章を読めばわかると思いますが、
AUTO_INCREMENT の値を、
AUTO_INCREMENT する列の最大値 + 1 に
設定する (減少させる) のは問題無いと思います。

が、それ以外の場合は、避けた方がよいでしょう。

・・・

S.S.Software 月額会員 のサービスのテストで発見した挙動です。

説明でなんとなくわかるかもしれませんが、
月額会員のユーザー ID を
AUTO_INCREMENT していく仕様です。

ユーザー ID は 1 番から開始してもよいのですが
1000 番までは、テストとか特別な用途向けに
とっておこうと思い、AUTO_INCREMENT の値を
1001 に設定したのですが、結果が 1 になる場合がありました。

設定した直後にテーブルが挿入されると
その後は完璧に動くので、
不具合に気付くのに時間がかかりました。

サービスを公開しようとしていた日に気付いたので
ちょっと、あたふたしてしまいました^^。

みなさんは、ご注意あれ。

・・・

今のところ S.S.Software 月額会員
のサービスはうまく動いてるっぽいです。

ミルノ PC フォトフレーム だけしか使わないなら、
月額 100 円相当のクラスで大丈夫なので、 気軽にお申し込みください。
月に缶ジュース 1 杯分くらいのお値段ですね。

S.S.Software 月額会員のお申し込みはこちらのページ からどうぞ。

月額会員 お申し込み
ブログ著者のホームページ
お問い合わせフォーム


コメント
コメントする