MySQL主キー命名戦略関連

MySQL主キー命名戦略関連

最近、データライフサイクル管理の詳細を整理していたときに、小さな問題を発見しました。それは、MySQL の主キー命名戦略が、あらゆる形式のカスタム命名を無視しているように見えることです。

つまり、主キーに idx_pk_id という名前を付けると、MySQL では PRIMARY として扱われます。

もちろん、これを基にして拡張や追加を行うこともできます。

まず、問題を再現してみましょう。データベース test に接続し、テーブル test_data2 を作成します。

mysql> テストを使用する

mysql> テーブル test_data2 (id int 、name varchar(30)) を作成します。

クエリは正常、影響を受けた行は 0 行 (0.05 秒)

次に、主キーを作成し、idx_pk_id という名前を付けます。実行状況からすると、MySQL はこれを正常に処理します。

mysql> テーブル test_data2 を変更し、主キー idx_pk_id(id) を追加します。
クエリは正常、影響を受けた行は 0 行 (0.02 秒)
レコード: 0 重複: 0 警告: 0

さらに比較するために、一意のインデックス(セカンダリ インデックス)を追加して違いを確認します。

mysql> テーブル test_data2 を変更し、一意のキー idx_uniq_name(name) を追加します。
クエリは正常、影響を受けた行は 0 行 (0.00 秒)
レコード: 0 重複: 0 警告: 0

主キーの命名方法1を表示: show indexesコマンドを使用する

MySQL インデックス情報を表示するには、test_data2 から show indexes を使用します。

mysql> test_data2\G のインデックスを表示
************************** 1. 行 ****************************
    テーブル: test_data2
  非ユニーク: 0
   Key_name: PRIMARY
 インデックス内のシーケンス: 1
 列名: id
  照合: A
 カーディナリティ: 0
   サブパート: NULL
    パック: NULL
     ヌル: 
  インデックスタイプ: BTREE
   コメント: 
インデックスコメント: 
************************** 2. 行 ****************************
    テーブル: test_data2
  非ユニーク: 0
   キー名: idx_uniq_name
 インデックス内のシーケンス: 1
 列名: 名前
  照合: A
 カーディナリティ: 0
   サブパート: NULL
    パック: NULL
     ヌル: はい
  インデックスタイプ: BTREE
   コメント: 
インデックスコメント: 
セット内の 2 行 (0.00 秒)

主キーの命名方法 2 を表示: データ ディクショナリ information_schema.statistics を使用する

コマンド方式は汎用性が十分ではありません。データ辞書 information_schema.statistics を使用してデータを抽出できます。

mysql> information_schema.statistics から * を選択します。ここで、table_schema='test' および table_name='test_data2' は 20 を制限します \G        
************************** 1. 行 ****************************
TABLE_CATALOG: 定義
 TABLE_SCHEMA: テスト
  テーブル名: test_data2
  非ユニーク: 0
 INDEX_SCHEMA: テスト
  インデックス名: プライマリ
 SEQ_IN_INDEX: 1
 列名: id
  照合: A
 カーディナリティ: 0
   サブパート: NULL
    パック: NULL
   NULL可能: 
  インデックスタイプ: BTREE
   コメント: 
インデックスコメント: 
************************** 2. 行 ****************************
TABLE_CATALOG: 定義
 TABLE_SCHEMA: テスト
  テーブル名: test_data2
  非ユニーク: 0
 INDEX_SCHEMA: テスト
  インデックス名: idx_uniq_name
 SEQ_IN_INDEX: 1
 COLUMN_NAME: 名前
  照合: A
 カーディナリティ: 0
   サブパート: NULL
    パック: NULL
   NULL可能: はい
  インデックスタイプ: BTREE
   コメント: 
インデックスコメント: 
セット内の 2 行 (0.00 秒)

主キーの命名方法3を表示: show create tableコマンドを使用する

テーブル作成ステートメントを表示すると、主キー名がフィルター処理されていることがわかります。

mysql> テーブル test_data2\G の作成を表示します
************************** 1. 行 ****************************
    テーブル: test_data2
テーブルの作成: CREATE TABLE `test_data2` (
 `id` int(11) NULLではない、
 `name` varchar(30) デフォルト NULL,
 主キー (`id`)、
 ユニークキー `idx_uniq_name` (`name`)
) エンジン=InnoDB デフォルト文字セット=utf8
セット内の 1 行 (0.00 秒)
作成ステートメントと変更ステートメントが別々に実行されるため、処理方法が異なるのではないかと疑問に思う受講者もいるかもしれません。これは 1 つのステップで実行でき、作成ステートメントで主キー名を宣言できます。
テーブル `test_data3` を作成します (
 `id` int(11) NULLではない、
 `name` varchar(30) デフォルト NULL,
 主キー idx_pk_id(`id`),
 ユニークキー `idx_uniq_name` (`name`)
)ENGINE=InnoDB デフォルト文字セット=utf8;

この時、テーブル作成文を確認すると、結果は上記と同じで、主キー名は PRIMARY となっていることがわかります。

mysql> テーブル test_data3\G の作成を表示します    
************************** 1. 行 ****************************
    テーブル: test_data3
テーブルの作成: CREATE TABLE `test_data3` (
 `id` int(11) NULLではない、
 `name` varchar(30) デフォルト NULL,
 主キー (`id`)、
 ユニークキー `idx_uniq_name` (`name`)
) エンジン=InnoDB デフォルト文字セット=utf8
セット内の 1 行 (0.00 秒)

ビュー主キーの命名方法 4: ビュー制約の命名

もちろん、検証する方法は他にもたくさんあります。たとえば、制約を使用して主キーに名前を付けると、取得される主キー名は PRIMARY になります。

存在しない場合はテーブルを作成 `default_test` (
 `default_test`.`id` SMALLINT NOT NULL AUTO_INCREMENT、
 `default_test`.`name` LONGTEXT NOT NULL、
制約 `pk_id` 主キー (`id`)
);

主キーの命名方法 5 を表示する: DML エラー情報を使用する

もちろん、DML ステートメントを使用するなど、検証する方法は他にもたくさんあります。

mysql> test_data2 に値(1,'aa')を挿入します。
クエリは正常、1 行が影響を受けました (0.02 秒)
mysql> test_data2 に値(1,'aa')を挿入します。
エラー 1062 (23000): キー 'PRIMARY' のエントリ '1' が重複しています

上記の方法により、この詳細についてより深く理解することができ、もちろんさらに深く理解することもできます。

主キーの命名方法 6 を表示: 公式ドキュメント

公式ドキュメントには実際にこの情報が含まれていますが、あまり明確ではありません。

主キーの説明は以下のとおりです。主キーの名前が PRIMARY であるという特別な記述があります。

  • テーブルには PRIMARY KEY を 1 つだけ設定できます。
  • PRIMARY KEY の名前は常に PRIMARY であるため、他のタイプのインデックスの名前として使用することはできません。
  • PRIMARY KEY がなく、アプリケーションでテーブルに PRIMARY KEY を指定する必要がある場合、MySQL は NULL 列を持たない最初の UNIQUE インデックスを PRIMARY KEY として返します。
  • InnoDB テーブルでは、セカンダリ インデックスのストレージ オーバーヘッドを最小限に抑えるために、PRIMARY KEY を短く保ちます。各セカンダリ インデックス エントリには、対応する行のプライマリ キー列のコピーが含まれます。
  • 作成されたテーブルでは、最初に PRIMARY KEY を配置し、次にすべての UNIQUE インデックスを配置し、最後に非一意のインデックスを配置します。これにより、MySQL オプティマイザは使用するインデックスを優先順位付けし、重複する UNIQUE キーをより速く検出できるようになります。

主キーの命名方法 7: ソースコードを表示

主キー名は sql_table.cc で定義されます。

const char *主キー名="PRIMARY";

この道をたどると、さまざまなレイヤーの実装におけるいくつかの論理的な状況がわかります。

まとめ:

これらの方法により、主キーの命名について大まかに理解できました。PRIMARY がこのように命名されているのはなぜでしょうか。いくつかのポイントをまとめました。

1) 統​​一された命名は標準として理解できる

2) ユニーク インデックスと区別できます。たとえば、ユニーク インデックスが空でない場合、プロパティは非常に類似しており、主キーに名前を付けることで区別できます。また、一部の機能やインデックスの使用シナリオでは、簡単に区別できます。

3) 主キーはテーブル インデックスの最初の位置です。名前を統一すると、フィールドが主キーにアップグレードされるシナリオなど、論理的な判断が明確になります。

4) また、オプティマイザ処理がより便利になり、使用するインデックスを決定する際の MySQL オプティマイザの優先度が上がります。

上記は、MySQL 主キー命名戦略に関する詳細です。MySQL 主キー命名戦略の詳細については、123WORDPRESS.COM の他の関連記事をご覧ください。

以下もご興味があるかもしれません:
  • MySQL の自動増分主キーに関する詳細な説明
  • Mysql 主キー UUID と自動増分主キーの違いと利点と欠点
  • MySQL の自動増分主キーが使い果たされた場合の対処方法
  • MySQL の自動増分 ID (主キー) が不足した場合の解決策
  • MySQL が uuid または snowflake id を主キーとして使用することを推奨しない理由の詳細な分析
  • MySQL テーブルにおける非主キー列オーバーフロー監視の詳細な説明
  • Prometheus を使用して、MySQL の自動増分主キーの残りの使用可能パーセンテージをカウントします。
  • 主キーを追加または変更するMySQL SQL文操作

<<:  ApacheとTomcatを組み合わせて静的状態と動的状態を分離する方法

>>:  フロントエンド JavaScript におけるリフレクションとプロキシ

推薦する

MySQL 5.7.17 最新インストールチュートリアル(画像とテキスト付き)

mysql-5.7.17-winx64 は MySQL の最新バージョンです。インストールは無料で...

MySQL Server 8.0.3 のインストールと設定方法のグラフィックチュートリアル

この文書はMySQL Server 8.0.3のインストールと設定方法を参考のために記録したものです...

Webpack4プラグインの実装原理についての簡単な説明

目次序文知る練習すれば完璧になる序文wabpack では、ローダーの他にプラグインがコア機能です。プ...

Vueは大画面ページのスクリーン適応を実現します

この記事では、大画面ページのスクリーンアダプテーションを実現するためのVueの具体的なコードを参考ま...

HTML テーブルの行間および列間の操作 (rowspan、colspan)

一般的に、<td> 要素の colspan 属性はセルの列間操作を実装するために使用され...

MySQL 5.7.18 Green Edition のダウンロードとインストールのチュートリアル

この記事では、MySQL 5.7.18のグリーンバージョンをダウンロードしてインストールする詳細な手...

JS関数のカリー化の詳細な説明

目次1. 補足知識ポイント: 関数の暗黙的な変換2. 補足知識: call/apply を使って配列...

MySQL の自動インクリメント主キーが連続していないのはなぜですか?

目次1. はじめに2. 自己増分ストレージの説明3つの自己付加価値修正メカニズム4. 自己評価を修正...

JavaScriptはスクロールバーの位置を取得し、ページをアンカーポイントまでスライドします。

序文この記事は、私が最近仕事で遭遇した問題を記録したものです。アプリネイティブとフロントエンドのh5...

一般的な MySQL 関数の例の概要 [集計関数、文字列、数値、時刻と日付の処理など]

この記事では、よく使用される MySQL 関数について説明します。ご参考までに、詳細は以下の通りです...

MySQL はパスワード強度の検証をオフにします

パスワード強度検証について: [root@mysql mysql]# mysql -uroot -p...

CentOS での MySQL ログイン 1045 問題を解決する

アプリケーション全体を CentOS にデプロイする必要があるため、当然ながらデータベース操作は不可...

MySQL 5.7 でルートパスワードを変更する方法

MySQL 5.7 以降では、多くのセキュリティ更新が追加されました。旧バージョンのユーザーは慣れて...

HTMLでマスクレイヤーを実装する方法 HTMLでマスクレイヤーを使用する方法

Web ページでマスク レイヤーを使用すると、繰り返しの操作を防ぎ、読み込みを促進できます。また、ポ...

Docker コンテナのマウントディレクトリ操作の表示

Dockerコンテナのマウントディレクトリ情報のみを表示する docker 検査 --format ...