MySQLのint主キーの自己増分の問題を解決する

MySQLのint主キーの自己増分の問題を解決する

導入

MySQL データベースを使用する場合、int を主キーとして使用し、自動インクリメントに設定することに慣れています。これにより、一意性が保証され、使いやすいです。ただし、int 型の長さには制限があります。長さを超えた場合はどうなるでしょうか?

問題を明らかにする

まずテストテーブルを作成しましょう。作成ステートメントは次のとおりです。

テーブルtest1を作成します(
  id INT 主キー AUTO_INCREMENT、
  名前 VARCHAR(20)
)

次に、2 つのデータを挿入します。

test1 に VALUES(NULL, 'Calf') を挿入します。
INSERT INTO test1 VALUES(NULL,'大牛');

クエリ テーブルは通常どおり表示されます。

ここに画像の説明を挿入

signed int 型の範囲は 231 -1 = 2147483647 です。次のように、ID 2147483647 のデータを直接挿入します。

test1 に挿入 VALUES(2147483647 ,'Xiaohua')

結果は正常です:

ここに画像の説明を挿入

この時点で、自動インクリメント ID は int 型の上限に達しています。さらにデータを挿入すると、エラーが報告されます。

test1 に値(NULL、'cow')を挿入します。

ここに画像の説明を挿入

この時点では、主キーを増分することはできず、挿入された ID は依然として 2147483647 のままであり、主キーの一意の条件に違反しているため、エラーが報告されます。

問題を解決する

(1)より大きなデータ型bigintを使用する

bigintの範囲は263-1、いわゆる指数爆発で、このときのサイズは9,223,372,036,854,775,807という恐ろしい大きさに達します。簡単に言えば、bigintを使用して1日に100万個のデータを保存すると、爆発するまでに200億年かかります。したがって、現在のシナリオでは、bigintの自動インクリメントを心配する必要はほとんどありません。

図に示すように、データ型をbigintに変更します。

ここに画像の説明を挿入

次に、挿入ステートメントを実行します。

test1 に値(NULL、'cow')を挿入します。

再び正常に挿入できます:

ここに画像の説明を挿入

(2)UUIDを主キーとして使う

UUID は、現在のシステム パフォーマンスやタイムスタンプなどの一連のパラメータに基づいて計算され、世界で唯一の文字列を取得することは周知の事実であり、MySQL は UUID を生成する方法を提供しています。これを主キーとして使用すると、データの一意性を確保できます。

次のコードを使用して 32 ビットの UUID を生成できます。

-- 32ビットUUIDを生成する
UUID として REPLACE(UUID(),'-','') を選択します。

ここに画像の説明を挿入

次に、テスト テーブルを作成しましょう。

テーブルtest2を作成します(
  id VARCHAR(50) 主キー、
  名前 VARCHAR(20) NULLではない
)

データを挿入します:

-- UUID を挿入
test2 に挿入 VALUES(REPLACE(UUID(),'-',''),'老王');

ここに画像の説明を挿入

しかし、挿入文を書くたびに UUID 関数を手動で書くのはちょっと面倒に思えます。トリガーを書いて、トリガーが自動的に ID を設定するようにすることができます。

-- トリガー DELIMITER $$ を作成
作成する
TRIGGER auto_id -- 名前 BEFORE INSERT -- トリガー時間 ON test2 FOR EACH ROW -- test2 テーブルに作用し、データの各行に効果があります BEGIN
IF new.id = '' THEN -- id が空の文字列の場合は UUID を設定します
  SET new.id = REPLACE(UUID(),'-','');
終了の場合;
終わり$$

データを挿入します:

-- データを挿入します INSERT INTO test2 VALUES('','Xiao Wang');

結果は普通に追加できる

ここに画像の説明を挿入

要約する

(1) int型とbigInt型はUUIDよりも追加、削除、変更、クエリが高速で、より多くのスペースを節約できます。

(2)UUIDを使うと便利です。

自動インクリメント int を主キーとして使用するのはなぜですか?

主キーのデータ型として unsigned auto-incrementing int を使用する必要があることは誰もが知っていると思いますが、varchar、text、varchar などの型ではなく auto-incrementing int を使用する必要がある理由をご存知ですか?

誰もがいくつかの利点を指摘することができます。上位レベルのビジネスに対して透過的であり、データを挿入するときに明示的に指定する必要がないこと、シンプルなデータ型、テーブル構造の保存と維持が容易であることなどです。

実は、自動インクリメント int を主キーとして使用することには多くの利点があります。今日はそれについて学び、実際の開発では自動インクリメント int を主キーとして使用することを強くお勧めします。

アドバンテージ:

1. Int は、varchar、char、text よりもストレージ スペースが少なく、データ型が単純なため、CPU オーバーヘッドを節約でき、テーブル構造を維持しやすくなります。

2. デフォルトでは、主キーに主キーインデックスが作成されます。主キーとして整数を使用すると、より多くのインデックスをメモリにロードし、クエリのパフォーマンスを向上させることができます。

3. InnoDB ストレージ エンジンの場合、各セカンダリ インデックスは、インデックス値のサフィックスとして主キーを使用します。自動増分主キーを使用すると、インデックスの長さ (サイズ) が削減され、より多くのインデックス データをメモリにロードしやすくなります。

4. インデックス データをよりコンパクトにできます。データの挿入、削除、更新時に、インデックス データのページの移動と分割を最小限に抑え、フラグメントの生成を減らし (テーブルの最適化を通じてテーブルを再構築できます)、メンテナンス コストを削減できます。

5. データを挿入する際に、論理的に隣接する要素が物理的にも隣接していることを保証できるため、範囲検索に便利です。

もちろん、自動増分 int を主キーとして使用することには欠点がないわけではありません。また、同時実行性が高い状況ではロック競合の問題が発生する可能性もあります。

上記は私の個人的な経験です。参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • MySQL の自動増分 ID (主キー) が不足した場合の解決策
  • MySQLの数値型自動増分における落とし穴
  • MySQL 自動インクリメント ID のオーバーサイズ問題のトラブルシューティングと解決策
  • MySQLの自動増分IDの開始値を変更する方法
  • MySQL の自動増分 ID に関するいくつかの小さな問題の要約

<<:  オブジェクトアニメーションによってブロックされずにオブジェクトに div を表示する方法

>>:  Docker 階層化パッケージを使用して Spring Boot を設定する方法

推薦する

Windows で MySQL データベースを別のディスクに移動する

序文今日、MySQL をインストールしたところ、データベース ストレージがデフォルトで C ドライブ...

CentOS 8.4 での Docker パッケージのオフラインインストールの問題について

使用する仮想マシンは、サーバー環境をシミュレートする CentOS 8.4 です。外部ネットワークに...

SeataがMySQL 8バージョンを使用できない問題を解決する方法

考えられる理由: Seata が MySQL 8 をサポートしない主な理由は、接続ドライバーがバージ...

新しいユーザーを作成し、MySQLに権限を付与する最も簡単な方法

ユーザーを作成します: 'oukele' によって識別されるユーザー 'ou...

iOS、Android、ミニプログラムアプリの敷居の低い開発のためのフロントエンドフレームワークを詳しく解説

現在、クロスプラットフォーム開発技術はもはや新しい話題ではありません。市場にはいくつかのオープンソー...

MySQL 起動時に「サーバーは PID ファイルを更新せずに終了しました」というエラーが報告される理由の詳細な分析

多くの人が MySQL の起動時にこのエラーに遭遇しています。まず、このエラーの前提は、サービス ス...

CSS3プロパティline-clampはテキスト行の使用を制御します

説明: ブロック要素に表示されるテキストの行数を制限します。 -webkit-line-clamp ...

Ubuntuの基本設定: openssh-serverのインストールと使用

Ubuntu 17.10 での openssh-server のインストールと使用を記録します。イン...

ロンボク実装 JSR-269

序文導入Lombok は、Google Guava と同様に便利なツールであり、強くお勧めします。す...

Linux コマンドにおける Ctrl+z、Ctrl+c、Ctrl+d の違いと使い方

Linux で Ctrl+c、Ctrl+d、Ctrl+z はどういう意味ですか? Ctrl+c と ...

Docker を使用して MySQL および Redis サービスをデプロイする方法

目次Dockerを使用してMySQLサービスをデプロイする方法DockerでRedisサービスをデプ...

Vue3 手動カプセル化ポップアップ ボックス コンポーネント メッセージ メソッド

この記事では、ポップアップボックスコンポーネントメッセージのVue3手動カプセル化の具体的なコードを...

JavaScript ループトラバーサルの 24 種類のメソッドをすべてご存知ですか?

目次序文1. 配列走査法1. 各() 2. マップ() 3. 〜のために4. フィルター() 5. ...

MySQLの重複排除方法

MySQLの重複排除方法【初級】繰り返しのセリフが少ないdistinctive を使用してそれらを見...

Maven プロジェクトのリモート デプロイメント && Tomcat を使用してデータベース接続を構成する方法

1つ。 tomcat を使用したリモート展開1.1 発生した問題:プロジェクトでは、サードパーティの...