最近、データライフサイクル管理の詳細を整理していたときに、小さな問題を発見しました。それは、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 であるという特別な記述があります。
主キーの命名方法 7: ソースコードを表示主キー名は sql_table.cc で定義されます。 const char *主キー名="PRIMARY"; この道をたどると、さまざまなレイヤーの実装におけるいくつかの論理的な状況がわかります。 まとめ:これらの方法により、主キーの命名について大まかに理解できました。PRIMARY がこのように命名されているのはなぜでしょうか。いくつかのポイントをまとめました。 1) 統一された命名は標準として理解できる 2) ユニーク インデックスと区別できます。たとえば、ユニーク インデックスが空でない場合、プロパティは非常に類似しており、主キーに名前を付けることで区別できます。また、一部の機能やインデックスの使用シナリオでは、簡単に区別できます。 3) 主キーはテーブル インデックスの最初の位置です。名前を統一すると、フィールドが主キーにアップグレードされるシナリオなど、論理的な判断が明確になります。 4) また、オプティマイザ処理がより便利になり、使用するインデックスを決定する際の MySQL オプティマイザの優先度が上がります。 上記は、MySQL 主キー命名戦略に関する詳細です。MySQL 主キー命名戦略の詳細については、123WORDPRESS.COM の他の関連記事をご覧ください。 以下もご興味があるかもしれません:
|
<<: ApacheとTomcatを組み合わせて静的状態と動的状態を分離する方法
>>: フロントエンド JavaScript におけるリフレクションとプロキシ
mysql-5.7.17-winx64 は MySQL の最新バージョンです。インストールは無料で...
この文書はMySQL Server 8.0.3のインストールと設定方法を参考のために記録したものです...
目次序文知る練習すれば完璧になる序文wabpack では、ローダーの他にプラグインがコア機能です。プ...
この記事では、大画面ページのスクリーンアダプテーションを実現するためのVueの具体的なコードを参考ま...
一般的に、<td> 要素の colspan 属性はセルの列間操作を実装するために使用され...
この記事では、MySQL 5.7.18のグリーンバージョンをダウンロードしてインストールする詳細な手...
目次1. 補足知識ポイント: 関数の暗黙的な変換2. 補足知識: call/apply を使って配列...
目次1. はじめに2. 自己増分ストレージの説明3つの自己付加価値修正メカニズム4. 自己評価を修正...
序文この記事は、私が最近仕事で遭遇した問題を記録したものです。アプリネイティブとフロントエンドのh5...
この記事では、よく使用される MySQL 関数について説明します。ご参考までに、詳細は以下の通りです...
パスワード強度検証について: [root@mysql mysql]# mysql -uroot -p...
アプリケーション全体を CentOS にデプロイする必要があるため、当然ながらデータベース操作は不可...
MySQL 5.7 以降では、多くのセキュリティ更新が追加されました。旧バージョンのユーザーは慣れて...
Web ページでマスク レイヤーを使用すると、繰り返しの操作を防ぎ、読み込みを促進できます。また、ポ...
Dockerコンテナのマウントディレクトリ情報のみを表示する docker 検査 --format ...