勉強したことのメモ

webプログラマ見習いが勉強したことのメモ。

InnoDBのオートインクリメント

      2016/07/01

MySQLのInnoDBでIDというカラムにオートインクリメント設定していたが、「1.2.3.4.5」と順番にならずに「1.5.9.10.13」と飛び飛びになっている現象があり、それが原因で障害が発生した。

 

飛び飛びになっていた理由

INSERT ~ ON DUPLICATE KEY UPDATEを使った場合、次回のインサート時はIDが飛んでしまう模様。以下実験を行った。

 

実験

まず以下のようなテーブルを作った。テーブル名はtest_table。IDと名前と何らかの得点的なテーブル。

 

データを2行入れてみる。

 

この時点でのデータは以下の通り。

 

INSERT ~ ON DUPLICATE KEY UPDATEで更新をかけてみる。

 

この時点でのデータは以下の通り。

 

先ほどは更新だったけど、インサートになるようにINSERT ~ ON DUPLICATE KEY UPDATEを使う。

 

すると以下の通りIDが飛んでしまう。

尚、MyISAMで同様のテストをしたところちゃんと連番になった。

 

注意したい点

データが飛ぶのは問題なかったんだけど、頻繁に更新するプログラムだった為、IDがint型の上限を超えてしまうということが発生してしまった。しかも常時更新タイプのものだったのでその時点で障害が発生。

InnoDBでINSERT ~ ON DUPLICATE KEY UPDATEを使うときの挙動は覚えておく。

 - MySQL

  関連記事

msyql-image
MySQLで実行結果の行数取得

DBにデータがあるか調べる際にしばしば使用してたのでメモ。 $sql = " S ...

msyql-image
MySQLのtinyintのカラムにbool値を入れた場合

他所のシステムに携わることがあり中身を色々見ているとMySQLでtinyint( ...

msyql-image
MySQLでランダムに取得

SELECT カラム名 FROM テーブル名 ORDER BY RAND() L ...

msyql-image
MySQLでテーブル構造とデータをコピーする

MySQLで既にあるテーブルとデータに対して実験を行う必要があった。本番テーブル ...

msyql-image
直近のクエリで発行されたAUTO_INCREMENTの値を取得する

やりたかったことは、 新規登録(INSERT)なら、登録時のAUTO_INCRE ...

msyql-image
MySQLで開始から終了日付内を調べたいとき

等号不等号でもできるけど、BETWEENというのがよさそう。 ■参考サイト ht ...

msyql-image
プリペアドステートメント

個人的に得た内容として、SQL文だけ先にDBに送って、 変数は後で送る。だからS ...

msyql-image
お名前SDサーバにMySQLデータのインポート

お名前.comのレンタルサーバにそこそこ大きいサイズのMySQLデータを移行した ...

msyql-image
文字コードのutf8_general_ciとutf8_unicode_ciの違い

MySQLで設定する時に使っているサーバーによってデフォルトの文字コードがutf ...

images
PHPからMySQLデータを取得した際に一括で配列に入れる方法

MySQLからデータを取得して、PHP側で配列に入れる際に今まで一個ずつ書いてい ...