Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AUTO_INCREMENTのIDカラムがオーバーフローしたらどうなるの?実例から学ぶDB設計...

 AUTO_INCREMENTのIDカラムがオーバーフローしたらどうなるの?実例から学ぶDB設計の注意点

PHPerKaigi 2025の登壇資料です。

yamamoto-hiroya

March 18, 2025
Tweet

More Decks by yamamoto-hiroya

Other Decks in Technology

Transcript

  1. 自己紹介
 • やまもとひろや
 • NE株式会社 開発部マネージャー
 • X: @HiroyaYamamoto1
 •

    Qiita: @yamamoto_hiroya
 • Zenn: yamamoto_hiroya
 • 今回NE株式会社は4名登壇!
 • 新卒採用もやってるので是非!
 ◦ https://ne-inc.jp/recruit
 ◦ 「NE株 採用」で検索!

  2. INT型(UNSIGNED INT)とは
 普通のINT
 (符号あり)
 UNSIGNED INT
 (符号なし)
 • 数値を入れるためのデータ型です。
 •

    赤い部分がそれぞれの範囲です。
 • 通常のINTがマイナス値入るの忘れがち。
 • UNSIGNEDはマイナス値入らない=符号なしとも呼ぶ
 • 自分用: INTは約21億、符号なしは約43億
 0
 -2147483647
 4294967295
 2147483647

  3. • 以下のような挙動をします。
 • ID値が4294967295になった。
 • 次の処理でAUTO_INCREMENTのためIDを+1しようとしたが最大値のた め4294967295のままになった。
 • IDのカラムはPRIMARYのため重複できない。
 •

    そのため4294967295を再びINSERTしようとしてDuplicateエラーとなっ た。
 • 補足: 現在のauto_increment値の
 確認方法
 • SHOW TABLE STATUS LIKE 
 'sample_table';
 解説

  4. 補足
 • ちなみに今回の例はサービス開始し約5年で発生しました。
 ◦ 1日235万レコードペース
 • そもそもそんな大量のデータをデータベースに持ちたいか?という観点か ら注意が必要です。
 • どうしても持つ場合はBIGINTで持つと2^63乗まで持てます(約900京)


    ◦ 例えばこれを10年で使い切るには1日250兆のレコードが入り続ける必要があり、ほぼ使 い切らないくらい大きい上限値だと思ってもらって良いと思います。 
 ◦ もしBIGINTを使い切ったよっていうご経験がある方がいたら是非教えてください。 

  5. 学び
 • AUTO_INCREMENTで
 • PRIMARYの
 • INT型の
 • ID値が
 •

    上限に行くと
 • Duplicateエラーとなる。

  6. まとめ
 • 安易なID値設計は辞めましょう。
 ◦ デフォルトのINT型AUTO_INCREMENT, PRIMARYで本当に大丈夫か?
 • そもそもそのIDカラムは必要か?
 ◦ サロゲートキーか?ナチュラルキーか?

    
 • 全て考えてIDカラムを持つとして、ものすごいレコードが入る場合は BIGINTにしましょう。
 • そのテーブルは
 • 「どういう使われ方をするのか」
 • 「どういうデータが入るのか」
 • 「どれくらいの頻度で入るのか」
 • これらを考えて適切なテーブル設計をしていきましょう!