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ブラウザのレンダリング方法の詳細な理解

推薦する

MySQLスレーブのメンテナンスに関する経験の共有

序文: MySQL マスター/スレーブ アーキテクチャは、最も一般的に使用されるアーキテクチャ セッ...

SVN のインストールと基本操作 (グラフィック チュートリアル)

目次1. SVNとは何か2. SVNサーバーとクライアントの取得方法3. SVN ワークフローとアー...

Dockerコンテナを外部IPとポートにバインドする方法

Docker を使用すると、外部からコンテナにアクセスしたり、コンテナを相互接続したりすることで、ネ...

CSS スキル コレクション - 古典の中の古典

リンク上の点線のボックスを削除しますコードをコピーコードは次のとおりです。 a:アクティブ、a:フォ...

MySql 学習ノートにおけるトランザクション分離レベルの詳細な説明

背景トランザクションについて話すとき、誰もがそれに精通している必要があります。MySQL データベー...

Alibaba Cloud Server に MySQL データベースをインストールする詳細なチュートリアル

目次序文1. MySQLをアンインストールする2. MySQLをインストールする要約する序文学習中に...

DockerコンテナでJupyterノートブックを設定する方法

Jupyter ノートブックは、主に Python コードの記述、より具体的にはディープラーニング開...

Keras を使って SQL インジェクション攻撃を判断する (例の説明)

この記事では、ディープラーニングフレームワーク keras を使用して、SQL インジェクションの特...

Dockerでデータディレクトリを移行する方法

目次ディスク使用量の表示ディスク クリーンアップ (軽々しく使用しないでください)データの移行ディス...

Windows10 での MySQL msi インストール チュートリアル (画像とテキスト付き)

1. ダウンロード1. MySQL msi 公式 Web サイトから最新のダウンロードをクリックす...

docker で golang イメージに基づいて ssh サービスを構築する方法

以下は、docker の golang イメージに基づいて ssh サービスを構築するためのコードで...

Vueはテーマ切り替えのための複数のアイデアを実装します

目次テーマを動的に変更する最初の方法: 動的コンポーネント2番目の方法はルーティング分離です要約する...

CSSを使用してアダプティブスクエアを実装する方法の例

伝統的な方法は、正方形を固定形式で書くことです。長さ=幅を直接書き、次のように固定値を書きます。 。...

mysql: [エラー] 不明なオプション '--skip-grant-tables'

MySQL データベースがエラー 1045 (28000): ユーザー 'ODBC'...