Mysql で自動増分主キー ID を更新するときに問題が発生しました

Mysql で自動増分主キー ID を更新するときに問題が発生しました

これは私が知っている問題ですが、私は罠に陥りそうになりました(忘れそうになりましたが、幸いにもオンライン前にオンラインポイントを整理したときに思い出しました)ので、ここに特別に記録しました

自動インクリメント ID を更新する理由は何ですか?

過去のビジネス上の問題により、ID のバッチを更新する必要があり、競合を避けるために、更新のために ID を数倍に拡張する必要がありました。テーブル内のデータ量は多くなく、読み取りが多く書き込みが少ない状況であるため、単純に 1000 ずつ拡張しました。

質問

MySQL では、自動増分主キーをより大きな値に更新すると (たとえば、自動増分 ID の最大値が 1000 で、ID=49 のレコードを ID=1049 に更新すると)、MySQL はテーブルの自動増分値を更新後の値に変更しません。 DDL や再起動後など、場合によっては、業務がエラーを報告し始めます。 このとき、現在の操作を知らないと、現在の業務操作に問題があると誤解する可能性があります。 実際は、更新 ID によって埋められた落とし穴 (主キーの競合) が原因です。
以下のように表示されます。

図1: 更新前のオリジナルデータ

生データ

更新ステートメントを実行する

テスト セット id = 2 の場合、テスト セット id = 10 を更新します。

図2: 更新されたデータ

更新されたデータ

新しい挿入ステートメントを実行する

テスト(名前)値を挿入('dddd')

図3: 挿入された新しいデータ

新しいデータを挿入した後

この時点で、誰もがこの問題に遭遇したことがあると思います。更新後、最初は問題がないかもしれませんが、自己増加 ID が更新した最大値に追いつくと、ID の競合は避けられません。 。 。

解決方法

1. 個人的なテストライブラリの場合は重要ではありません。データベースを再起動できます。
2. もちろん、あなたが非常にわがままでない限り (そして、わがままを言うのに DBA の同行が必要)、オンライン データベースをこのように設定することはできません。このとき、ソフト削除されたデータなど、ビジネス上意味のないデータを挿入するために ID を指定してみることができます。(私のケース リストにはソフト削除マークがありません。ご理解いただけると思います。)

テスト(id,name)値(20,'eeee')を挿入します。

操作後は図のようになります。

IDを指定して挿入

次のSQL文を実行して結果を比較します。

テスト(名前)値('ffff')を挿入します。

比較結果

この時点で、自動インクリメント ID は最大値から増加し始めています。

情報を検索したところ、このバグは 2005 年に発生したが、パフォーマンスとシナリオが少ないために修正されなかったことがわかりました。この問題は、MySQL 8.0.11 では正常に動作します。

これで、Mysql の自動増分主キー ID の更新で発生した問題に関するこの記事は終了です。Mysql の自動増分主キー ID の更新に関する関連コンテンツの詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL 主キー ID を生成する方法 (自己増分、一意、不規則)
  • MySQLの自動増分主キーIDはこのように処理されません

<<:  HTML テーブル_Powernode Java アカデミー

>>:  指定されたIEブラウザのレンダリング方法の詳細な理解

推薦する

非常に便利な CSS 開発ツール 8 つを紹介

CSS3 パターン ギャラリーこの CSS3 パターン ライブラリには、純粋な CSS3 を使用して...

HTML でテーブルを分割および結合する (colspan、rowspan)

このコードは水平マージを示しています。 <!DOCTYPE html PUBLIC "...

Vue プロジェクトでの支払い機能の実装 (WeChat 支払いと Alipay 支払い)

目次プロジェクトにおける一般的な支払い方法Alipay決済微信ペイプロジェクトにおける一般的な支払い...

js と jQuery での Ajax の使用例の詳細

目次ネイティブJS GETリクエストの送信方法投稿リクエストの送信方法パラメータ付きのGETリクエス...

Linux 面接で最もよく聞かれる 10 の質問のまとめ

序文Linux システムの運用および保守エンジニア職の面接を受ける場合は、次の 10 個の最も一般的...

.html、.htm、.shtml、.shtm の違いと関連性について簡単に説明します。

ご存知のとおり、私たちが毎日閲覧する Web ページ、Web サイト、または Web ページには独自...

DIVのぼかし機能を実装する方法

マウスを動かしたときにDIVが消えるように手ぶれ補正を使用するdiv タグ自体は onblur イベ...

IE アドレスバーのアイコン表示問題を解決する 3 つの手順

<br />この Web ページ制作スキル チュートリアルは、Web サイトのアイコンを...

データベースインデックスの知識ポイントの概要

目次ファーストルックインデックスインデックスの概念インデックスファイルの構成インデックスの役割SQL...

CentOS 7.4 に MySQL 5.7 を手動でインストールする方法

MySQL データベースは、特に JAVA プログラマーの間で広く使用されています。クラウド データ...

ubuntu16.04 で nginx を完全にアンインストールするための関連コマンド

nginx の概要nginx は、無料のオープンソースの高性能 HTTP サーバーおよびリバース プ...

doctype のマークアップ検証

しかし最近、この方法を使用すると問題が発生することがわかりました。コードを参照してください。コードを...

フォームアクションとonSubmitの例

まず、action はフォームの属性です。HTML5 では必須の属性値として定義されています。onS...

HTTPプロトコルにおけるステータスコードの意味

暫定的な応答を示し、要求者に操作の続行を要求するステータス コード。コードの説明100 (続行) リ...

CSS アニメーション プロパティの使用方法とサンプル コード (transition/transform/animation)

開発中、優れたユーザー インターフェイスには常にいくつかのアニメーションが組み込まれます。 CSS ...