PK がオーバーフローする可能性がある場合に対応するにはどうすればよいですか?
可能性は低いですが、それでも可能です。おそらく多くのリクエストがあったため、ニュースレターのオプトアウト フォームが機能しないのを見たことがあります。
アプリケーション側で何ができますか? MySQL でできること
PK がオーバーフローする可能性がある場合に対応するにはどうすればよいですか?
可能性は低いですが、それでも可能です。おそらく多くのリクエストがあったため、ニュースレターのオプトアウト フォームが機能しないのを見たことがあります。
アプリケーション側で何ができますか? MySQL でできること
PKがオーバーフローする可能性がある場合に対応するにはどうすればよいですか?
簡単な解決策は、PKのタイプが十分に大きく、妥当なユースケースでオーバーフローが発生しないようにスキーマを設計することです。
その仮定が失敗した場合は、問題があります。私はいくつかの可能なオプションを考えることができます。
PKタイプを「より大きな」タイプに変更し、アプリケーションを変更してデータを移行します。
キースペースを「コンパクト」にするアプリケーションを作成します。つまり、ライブキーごとに、キーを使用するすべてのレコードを更新して、新しいキーに置き換えます...スペースの先頭から開始します。
キースペースをラップし、より複雑なジェネレーターを使用して、各候補キーがまだ使用されていないことを確認する次のキーを取得します。
この種のものは、特に予測が難しく、テストが難しいため、通常はシステムに組み込まれていないことに注意してください。
私は、32 ビットの INT がオーバーフローした 1 つのケースに取り組みました。これは、行の挿入が成功するたびに、アプリが誤って 1000 個の値をスキップしていたためです。その場合、アプリは最大の符号付き INT 値に達し、そのテーブルでそれ以上の挿入を行うことができませんでした。BIGINT 主キーを使用するようにテーブルを再構築するのを手伝うために、私が呼ばれました。
しかしもちろん、それを行う前に、参照テーブルのすべての外部キーも BIGINT を使用するように変更する必要がありました。他のテーブルの FK によって参照できなかった新しい PK 値をメイン テーブルに挿入したくないためです。
新しい行を挿入するたびに 10 億の値をスキップしない限り、BIGINT の値の範囲を使い果たすには、私たちの寿命よりも長くかかるはずです!
特定のデータベース内のすべての AUTO_INCREMENT PRIMARY KEY を調べ、オーバーフローにどの程度 (パーセンテージで) 近いかを計算する pk-full-ratioというスクリプトを作成しました。