【MySQL】AUTO_INCREMENTの値が増える、飛ぶ、欠番が発生する
問題
auto_incrementの値が飛び飛びになるんですけど。
答え
MySQL5.1.22以降、InnoDBのAUTO_INCREMENTの性能が向上しましたが、それに伴って、AUTO_INCREMENTの連番が飛ぶ場合が発生するようです。
プライマリーキー以外のユニークキーで重複してエラーとなる場合などです。
なお、MyISAMエンジンでは発生しません。
再現方法。
1、テーブルを作ります。ストレージエンジンはInnoDBにします。
CREATE TABLE test1 ( id int PRIMARY KEY AUTO_INCREMENT, a int NOT NULL UNIQUE ) ENGINE = InnoDB;
2、1行入ります
insert into test1 (a) values (1); +----+---+ | id | a | +----+---+ | 1 | 1 | +----+---+
3、プライマリキー以外のユニーク制約により挿入に失敗させます。
insert into test1 (a) values (1); # ERROR 1062: Duplicate entry '1' for key 'a' insert into test1 (a) values (1); # ERROR 1062: Duplicate entry '1' for key 'a' insert into test1 (a) values (1); # ERROR 1062: Duplicate entry '1' for key 'a' insert into test1 (a) values (1); # ERROR 1062: Duplicate entry '1' for key 'a'
4、ここで1行挿入すると、AUTO_INCREMENTの値が飛んでます。
insert into test1 (a) values (2); +----+---+ | id | a | +----+---+ | 1 | 1 | | 7 | 2 | +----+---+
シーケンスなどがあったとしても、シーケンスから値を取得してしまったら後戻りはしないので、AUTO_INCREMENT値が増えるのを異常とは考えずに、まあそういうものということでいいじゃないか と 思うことにします。
参考
説明と、設定による動作の変え方。
http://dev.mysql.com/doc/refman/5.1-olh/ja/innodb-auto-increment-configurable.html
コメント