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 におけるリフレクションとプロキシ

推薦する

ろうそくを溶かす(水滴)サンプルコードを実現する純粋な CSS

成果を達成する実装のアイデアフィルターのコントラストとぼかしを利用して溶ける効果を実現します。親要素...

Tkinterはjsキャンバスを使用してグラデーションカラーを実現します

目次1. RGBを使用して色を表す2. Tkinter キャンバスコンポーネント3. グラデーション...

CSS マスクを使用して PNG 画像のサイズを大幅に最適化します (推奨)

この記事は共有および集約することを歓迎します。全文を転載する必要はありません。著作権を尊重してくださ...

すべてのホストがmysqlにアクセスできるようにする方法

1. MySQLデータベースのユーザーテーブルのレコードのHostフィールド値を%に変更します。奇妙...

Linuxでのaliasコマンドの使い方の詳細な説明

1. 別名の使用alias コマンドは、コマンドのエイリアスを設定するために使用されます。このコマン...

HTML で JavaScript を使用する

<script> タグHTML5では、スクリプトには次の属性があります: async、d...

axios でリクエストをキャンセルし、重複リクエストを防ぐ方法について簡単に説明します。

目次序文コア - キャンセルトークン実用的なアプリケーションとパッケージングいくつかの小さな詳細序文...

テーブルの幅を固定して、テキストによって幅が変わらないように設定

ページ内のテーブルの幅を width="600px" に設定した後も、幅が固定さ...

Vue3.0 + TypeScript + Vite初体験の詳しい説明

目次プロジェクトの作成プロジェクト構造メイン.jsアプリ.vue:設定コンポジションAPI参照反応的...

ウェブ上でチャートを描くための 9 つの優れた JavaScript フレームワーク スクリプト

ウェブ上でチャートを描くための 9 つの優れた JavaScript フレームワーク スクリプト 1...

JavaScriptプロトタイプと例の詳細な説明

目次コンストラクタインスタンスとプロトタイプの関係プロトタイププロパティ属性またはメンバーの検索原則...

JavaScript ステートメントの一般的な for ループの詳細な説明

JavaScript には、for、for in、for of、forEach ループなど、多くのル...

nginx + php の「入力ファイルが指定されていません」の解決策

本日、ローカル開発環境で突然「入力ファイルが指定されていません」というエラーが発生してしまいました。...

Docker コンテナで ASP.NET Core を実行する手順

最近は学ぶべき知識が多すぎて、どれを先に学べばいいのかわかりません。このブログはもともとxamari...

WeChatアプレットはシンプルな計算機を実装する

WeChatアプレットの簡単な計算機は参考用です。具体的な内容は次のとおりです。 1. はじめに1....