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

推薦する

エラー 2002 (HY000): ソケット '/tmp/mysql.sock' 経由でローカル MySQL サーバーに接続できません

エラーメッセージ:エラー 2002 (HY000): ソケット '/tmp/mysql.so...

デザインにおけるユーザーエクスペリエンスの背後にある8つのユーザー本能について話す

編集者注: この記事は、Teambition チームの @娄昊川 が寄稿したものです。Teambit...

MySql で、存在しない場合は挿入し、存在する場合は更新する方法

まとめシナリオによっては、レコードがない場合は挿入し、レコードがある場合は更新するという要件がある場...

vue の v-bind を理解する

目次1. v-bindの主要ソースコードの分析1. v-bind属性はどこに均一に保存されるか: a...

CentOS8 jdk8 / java8 のインストールチュートリアル(推奨)

序文最初はCentOS8でwgetを使ってダウンロードし、解凍して環境変数を設定するつもりだったので...

vue3 キャッシュページキープアライブと統合ルーティング処理の詳細な説明

目次1. はじめに2. 使用1. vue2とvue3の違い2. ページ上の一部のデータはキャッシュす...

CentOS 7 で MySQL 接続数が 214 に制限される問題の解決方法

問題を見つける最近、プロジェクトで問題が発生しました。接続が多すぎるため、「接続が多すぎます」という...

Vue における ref と $refs の紹介と使用例

序文JavaScript では、document.querySelector("#demo...

CentOs システムで Python と yum をアンインストールするソリューション

事故の背景: 数日前、プロジェクトの必要性により、サーバーに python-mysql モジュールを...

MySQL マスタースレーブレプリケーションの読み書き分離構造の詳細な説明

MySQL マスタースレーブ設定MySQL のマスター/スレーブ レプリケーションと読み取り/書き込...

jsはreduceメソッドを使用してコードをよりエレガントにします

序文実際のプロジェクトでは、最も一般的な処理は計算とループロジックである可能性があります。配列でre...

HTML の入力の readonly 属性と disabled 属性の違いについて簡単に説明します。

「読み取り専用」と「無効」はどちらも、ユーザーがフォーム フィールドの内容を変更できないようにしま...

Centos7でのMySQLインストールチュートリアル

MySQLインストールチュートリアル、参考までに具体的な内容は次のとおりです。 1. ダウンロードY...

MySQL 5.5.27 インストール グラフィック チュートリアル

1. MYSQLのインストール1. ダウンロードしたMySQLインストールファイルmysql-5.5...

初心者のためのWebサイト構築入門 ③ エイリアス(CNAME)レコードとURL転送

①. エイリアス(CNAME)レコードの使用方法:前回の投稿のドメイン名解決では、A レコードの解...