MySQL の自動増分 ID に関するいくつかの小さな問題の要約

MySQL の自動増分 ID に関するいくつかの小さな問題の要約

以下の質問はすべて InnoDB ストレージ エンジンに基づいています。

1. 最も大きな ID を持つレコードが削除された後、新しく挿入されたレコードの ID は何ですか?

たとえば、現在のテーブルに ID 1、2、3 の 3 つのレコードがあり、3 が削除された場合、新しく挿入されたレコードの ID はどこから始まるのでしょうか。

答え: 4 から始めます。

実験

自動増分IDを持つテーブルtb0を作成します。

テーブル tb0(id int unsigned auto_increment primary key) を作成します。

3 つのレコードを挿入します:

tb0 に値 (null) を挿入します。

ID 3 のレコードを削除します。

tb0 から id=3 を削除

現在の自動増分値を表示します。

テーブル tb0 の作成を表示します。

# 結果CREATE TABLE `tb0` (
 `id` int(10) 符号なし NOT NULL AUTO_INCREMENT,
 主キー (`id`)
) エンジン=InnoDB AUTO_INCREMENT=4 デフォルト文字セット=latin1

自動インクリメント ID は 4 であり、最大の ID を持つレコードを削除しても、自動インクリメント ID の値には影響しません。

2. MySQL の再起動後、自動増分 ID はどこから始まりますか?

たとえば、現在のテーブルに ID 1、2、3 の 3 つのレコードがある場合、3 を削除して MySQL を再起動すると、新しく挿入されたレコードの ID はどこから始まるでしょうか?

4 から始まると思っている人が多いですが、実際は 3 から始まります。

InnoDB の自動インクリメント値はデータ ファイルではなくメモリに記録されるためです。

再起動後は、現在の最大 ID + 1 が開始値として使用されます。

実験

自動増分IDを持つテーブルtb1を作成します。

テーブル tb1(id int unsigned auto_increment 主キー) を作成します。

3 つのデータ レコードを追加します。

tb1 に値 (null) を挿入します。

ID 3 のレコードを削除します。

tb1 から id=3 を削除

前の質問から、この時点で自動インクリメント ID 値は 4 であることがわかります。

MySQLを再起動します。

現在の自動増分値を表示します。

テーブル tb1 を作成します。

# 結果CREATE TABLE `tb1` (
 `id` int(10) 符号なし NOT NULL AUTO_INCREMENT,
 主キー (`id`)
) エンジン=InnoDB AUTO_INCREMENT=3 デフォルト文字セット=latin1

3. ID を手動で挿入した後、次に挿入するときに自動的に増加する値は何ですか?

たとえば、現在の自動インクリメント ID が 4 で、新しいレコードを挿入するときに手動で ID を 10 に指定した場合、次に自動インクリメント方式を使用して挿入すると、ID は 11 になります。

ID自動増分 = 現在の最大ID + 1

新しいレコードを挿入すると、新しいID値が計算されます

実験

自動増分 ID を持つテーブル tb2 を作成します。

テーブル tb2(id int unsigned auto_increment 主キー) を作成します。

レコードを追加します:

tb2 に値 (null) を挿入します。

IDを手動で指定します:

tb2 に値 (4294967000) を挿入します。

現在の自動増分値を表示します。

テーブル tb2 の作成を表示します。

# 結果CREATE TABLE `tb2` (
 `id` int(10) 符号なし NOT NULL AUTO_INCREMENT,
 主キー (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4294967001 デフォルト文字セット=latin1

自動増分値が 4294967001 になることがわかります。

4. 自己付加価値を使い果たした後はどうするか

unsigned int の最大値は 4294967295 です。自動インクリメントがこの値に達すると、値は変更されず、新しいレコードが挿入されるとエラーが報告されます。

キー「PRIMARY」の重複エントリ「4294967295」

テーブル レコードの挿入と削除が頻繁に行われる場合、テーブル内のレコードの総数が多くなくても ID がすぐに使い果たされる可能性があります。この場合は、bigint が必要になることがあります。

int値の範囲:

intは4バイトで、最初の桁は符号を示すために使用されます。

符号付き範囲:
から - まで - 1

(-2147483648 から 2147483647)

符号なし範囲:
0から-1

(0~4294967295)

bigint値の範囲:

intは8バイトです

符号付き範囲:
から - まで - 1

(-9223372036854775808 から 9223372036854775807)

符号なし範囲:
0から-1

(0~18446744073709551615)

まとめ

実験を通じて、InnoDB の自己増分 ID のいくつかの特性がわかります。

新しいレコードを挿入すると、自動 ID が使用されているか、ID が手動で指定されているかに関係なく、新しい自動増分値 (最大 ID + 1) が計算されます。

最大 ID 値を削除しても自動増分 ID 値には影響しませんが、MySQL の再起動後には影響があります。以前の自動増分 ID 値は使用されず、最大 ID+1 が使用されます。これは、自動増分 ID 値がメモリに保存されており、再起動後に再計算する必要があるためです。

自動増分 ID は、使い切った後は変更されません。

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。

以下もご興味があるかもしれません:
  • MySQLの自動増分IDの開始値を変更する方法
  • MySQL の自動増分 ID を 0 に戻す方法
  • MySQLテーブルにおける自己増分IDの問題の解決
  • MySQL 自動インクリメント ID のオーバーサイズ問題のトラブルシューティングと解決策
  • MySQLの自動増分IDについて知っておくべきこと
  • MySQL の自動増分 ID (主キー) が不足した場合の解決策
  • MySQL 自動インクリメント ID 枯渇の例
  • MySQLの自己増分IDがなくなったらどうするか

<<:  Vue+swiperでタイムライン効果を実現

>>:  Linux システムコマンドのメモ

推薦する

Vue双方向バインディングの詳細な説明

目次1. 双方向バインディング2. 他のタグを選択した場合にも同じ結果になりますか? 答えはもちろん...

Dockerレジストリイメージ同期の実装アイデア

はじめに以前は、Docker イメージは Azure のコンテナー レジストリに保存されていました。...

MySQLはtruncateコマンドを使用してデータベース内のすべてのテーブルを素早くクリアします

1. まずSELECT文を実行して、すべての切り捨て文を生成します。ステートメント形式: selec...

Prometheus+Grafanaによるnginxの監視方法を分析する

目次1. ダウンロード2. nginxとnginx-vts-exporterをインストールする3. ...

HTML+CSS ボックスモデルの例 (円、半円など) 「border-radius」はシンプルで使いやすい

多くの友人は、フロントエンドを学習するときに、ボックス モデルがデフォルトで正方形であることに気付き...

WeChatアプレットの手動および自動追跡の実装の詳細説明(Taro)

どの企業もユーザーベースを拡大したいのであれば、ユーザーの操作データを収集・分析する必要があり、その...

要素 el-button ボタンコンポーネントの使用の詳細な説明

1. 背景ボタンは非常によく使われており、Element のボタン機能は非常に包括的です。この記事で...

Linux で Redis のリモート接続を実装する方法

LinuxにRedisをインストールしたら、Javaを使って接続します。Javaコードは次のとおりで...

Centos7 ベースの Varnish キャッシュ プロキシ サーバーを展開する

1. ワニスの概要1. ワニスの紹介Varnish は、新しいソフトウェア アーキテクチャを使用し、...

ReactとReduxの関係を詳しく説明

目次1. reduxとreactの関係2. Reactのマルチコンポーネント共有3. reduxの3...

nginx における proxy_pass のさまざまな使用法の詳細な説明

目次プロキシ転送ルール最初のもの: 2番目のタイプ: 3番目のタイプ: 4番目のタイプ: 5番目:プ...

Docker のタイムゾーンの問題とデータ移行の問題

最新のソリューション: -v /usr/share/zoneinfo/Asia/Shanghai:/...

大規模な Vue.js プロジェクトの構築と維持のための 10 のベスト プラクティス

目次1. スロットを使用してコンポーネントを理解しやすくし、より強力にする2. Vuexストアを正し...

Linux ファイアウォール設定の詳細な手順 (yum ウェアハウス設定に基づく)

序文この実験では、デバッグ用に2つの仮想マシン(CentOs6とRed Hat 6)を準備します。 ...

Linux 上での MySQL データベースのインストールと Java プロジェクトの構成に関する詳細なグラフィック説明

1. MySQLデータベースをインストールする① ダウンロードして解凍し、/opt/softディレク...