InnoDBのオートインクリメントで抜け番が発生する原因について
2024/02/25
MySQLのInnoDBでIDというカラムにオートインクリメント設定していたが、「1.2.3.4.5」と順番にならずに「1.5.9.10.13」と飛び飛びになっている現象があり、それが原因で障害が発生した。
飛び飛びになっていた理由
INSERT ~ ON DUPLICATE KEY UPDATEを使った場合、次回のインサート時はIDが飛んでしまう模様。以下実験を行った。
実験
まず以下のようなテーブルを作った。テーブル名はtest_table。IDと名前と何らかの得点的なテーブル。
+-------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | name | varchar(255) | NO | UNI | NULL | | | score | int(11) | NO | | NULL | | +-------+--------------+------+-----+---------+----------------+
データを2行入れてみる。
INSERT INTO test_table
(name, score)
VALUES
("tanaka",90), ("yamada",88)
この時点でのデータは以下の通り。
+----+--------+-------+ | id | name | score | +----+--------+-------+ | 1 | tanaka | 90 | | 2 | yamada | 88 | +----+--------+-------+
INSERT ~ ON DUPLICATE KEY UPDATEで更新をかけてみる。
INSERT INTO test_table
(name, score)
VALUES
("tanaka", 99)
ON DUPLICATE KEY UPDATE
score = 99
この時点でのデータは以下の通り。
+----+--------+-------+ | id | name | score | +----+--------+-------+ | 1 | tanaka | 99 | | 2 | yamada | 88 | +----+--------+-------+
先ほどは更新だったけど、インサートになるようにINSERT ~ ON DUPLICATE KEY UPDATEを使う。
INSERT INTO test_table
(name, score)
VALUES
("suzuki", 15)
ON DUPLICATE KEY UPDATE
score = 15
すると以下の通りIDが飛んでしまう。
+----+--------+-------+ | id | name | score | +----+--------+-------+ | 1 | tanaka | 99 | | 2 | yamada | 88 | | 4 | suzuki | 15 | +----+--------+-------+
尚、MyISAMで同様のテストをしたところちゃんと連番になった。
注意したい点
データが飛ぶのは問題なかったんだけど、頻繁に更新するプログラムだった為、IDがint型の上限を超えてしまうということが発生してしまった。しかも常時更新タイプのものだったのでその時点で障害が発生。
InnoDBでINSERT ~ ON DUPLICATE KEY UPDATEを使うときの挙動は覚えておく。
関連記事
-
-
MySQLのバイナリログ(/var/lib/mysql/binlog)を適切に削除する方法
レンタルしているVPS内のファイルを整理していると「/var/lib/mysql ...
-
-
MySQLでwhere句を使ってカラム指定でデータをコピーする方法
MySQLで大量のデータを保存しているテーブルがあり、そのデータを絞った上で尚且 ...
-
-
SortableJSを使ってデータの並べ替え&保存
あるシステムを拝見した際にtableタグ内に並んでいる項目をドラッグ&ド ...
-
-
MySQLにて指定したカラムがNULLもしくは空の場合、あらかじめ決めておいた内容で表示する方法
何らかのフォームとMySQLを組み合わせた際に任意入力の項目はそのカラムがNUL ...
-
-
MySQLでIPアドレスを数値として入れると変な値になる場合の対処方法
MySQLでIPアドレスをINET_ATON関数を用いてINT型に変換し格納する ...