MySQL 8.0の新機能、隠しフィールドの詳細な説明

MySQL 8.0の新機能、隠しフィールドの詳細な説明

序文

MySQL バージョン 8.0.23 では、新しい機能「Invisible Column (Invisible Field)」が追加されました。この記事では、MySQL の隠しフィールドの概念と具体的な実装について説明します。

基本概念

隠しフィールドはクエリ内で明示的に参照する必要があります。そうしないと、クエリには表示されません。 MySQL 8.0.23 では、隠しフィールドのサポートが開始されました。それ以前は、すべてのフィールドは表示フィールドでした。

次のアプリケーション シナリオを検討してください。アプリケーションが SELECT * ステートメントを使用してテーブルにアクセスし、クエリを続行する必要がある場合、アプリケーションが必要としない新しいフィールドをテーブルに追加しても、アプリケーションは正常に動作する必要があります。 SELECT * クエリの場合、アスタリスク (*) は非表示フィールドを除くテーブル内のすべてのフィールドを表すため、新しく追加されたフィールドを非表示フィールドとして定義できます。隠しフィールドは SELECT * クエリには表示されないため、アプリケーションは引き続き実行されます。アプリケーションの新しいバージョンでこのフィールドを使用する必要がある場合は、クエリで明示的に指定できます。

PS: SELECT * ステートメントを使用してデータをクエリすることは推奨されません。返される必要のあるフィールドを明確に指定する必要があります。

隠しフィールドと DDL ステートメント

デフォルトでは、作成されたフィールドは表示可能なフィールドです。列の可視性を明示的に指定する場合は、CREATE TABLE または ALTER TABLE ステートメントの列定義に VISIBLE または INVISIBLE キーワードを指定できます。例えば:

テーブルt1を作成します(
 私はINT、
 j 日付は非表示
)エンジン = InnoDB;
ALTER TABLE t1 に列 k INT INVISIBLE を追加します。

フィールドの可視性を変更する場合は、VISIBLE または INVISIBLE キーワードを使用することもできます。例えば:

ALTER TABLE t1 CHANGE COLUMN jj DATE VISIBLE;
ALTER TABLE t1 MODIFY COLUMN j DATE INVISIBLE;
テーブル t1 を変更して列 j を VISIBLE に設定します。

隠しフィールドを使用する場合は、次の点に注意してください。

  • テーブルには少なくとも 1 つの表示フィールドが必要です。すべてのフィールドを非表示に設定するとエラーが返されます。
  • 隠しフィールドは、NULL、NOT NULL、AUTO_INCREMENT などの一般的なフィールド属性をサポートします。
  • 生成された列は非表示のフィールドにすることができます。
  • インデックスでは、PRIMARY KEY インデックスや UNIQUE インデックスなどの隠しフィールドを使用できます。テーブルには少なくとも 1 つの表示可能な列が必要ですが、インデックス定義には表示可能な列を含める必要はありません。
  • テーブル内の隠しフィールドを削除すると、関連付けられているインデックスからもそのフィールドが削除されます。
  • 外部キー制約は非表示フィールドに基づいて定義でき、外部キー制約は非表示フィールドを参照することもできます。
  • CHECK 制約は、隠しフィールドに基づいて定義できます。データを挿入または更新するときに、隠しフィールドの CHECK 制約に違反するとエラーが返されます。

CREATE TABLE ... LIKE ステートメントを使用してテーブル構造をコピーすると、元のテーブルの隠しフィールドがコピーされ、新しいテーブルでも隠しフィールドとして残ります。 CREATE TABLE ... SELECT ステートメントを使用してテーブルをコピーする場合、明示的に指定しない限り、非表示の列は含まれません。ただし、元のテーブルに非表示のフィールドを含めた場合でも、それらのフィールドは新しいテーブルで表示されます。例えば:

mysql> テーブル t1 を作成します (col1 は INT、col2 は INT INVISIBLE)。
mysql> CREATE TABLE t2 AS SELECT col1, col2 FROM t1;
mysql> SHOW CREATE TABLE t2_G
************************** 1. 行 ****************************
  表: t2
テーブルの作成: CREATE TABLE `t2` (
 `col1` int デフォルト NULL,
 `col2` int デフォルト NULL
) エンジン=InnoDB デフォルト文字セット=utf8mb4 照合=utf8mb4_0900_ai_ci

これらの列の非表示属性を保持する場合は、CREATE TABLE の後にそれらの列の非表示属性を指定できます。例えば:

mysql> テーブル t1 を作成します (col1 は INT、col2 は INT INVISIBLE)。
mysql> CREATE TABLE t2 (col2 INT INVISIBLE) AS SELECT col1, col2 FROM t1;
mysql> SHOW CREATE TABLE t2_G
************************** 1. 行 ****************************
  表: t2
テーブルの作成: CREATE TABLE `t2` (
 `col1` int デフォルト NULL,
 `col2` int デフォルト NULL /*!80023 非表示 */
) エンジン=InnoDB デフォルト文字セット=utf8mb4 照合=utf8mb4_0900_ai_ci

ビューは隠しフィールドを参照できますが、定義で明示的に指定する必要があります。ビューが定義された後にフィールドの可視性を変更しても、ビューには影響しません。

隠しフィールドとDMLステートメント

SELECT ステートメントの場合、クエリ リストで明示的に指定されていない限り、非表示フィールドはクエリ構造に含まれません。クエリ リスト内の * および tbl_name.* には隠しフィールドは含まれません。自然結合には隠しフィールドは含まれません。

次の文について:

mysql> テーブル t1 を作成します (col1 は INT、col2 は INT INVISIBLE)。
mysql> t1 (col1, col2) に値 (1, 2), (3, 4) を挿入します。

mysql> t1 から * を選択;
+------+
| 列1 |
+------+
| 1 |
| 3 |
+------+

mysql> t1 から col1、col2 を選択します。
+------+------+
| 列1 | 列2 |
+------+------+
| 1 | 2 |
| 3 | 4 |
+------+------+

最初の SELECT ステートメントは隠しフィールド col2 を参照しません (* 隠しフィールドは除外されます)。そのため、クエリ結果に col2 フィールドは返されません。 2 番目の SELECT ステートメントは col2 フィールドを明示的に指定するため、そのフィールドがクエリ結果に返されます。

クエリ ステートメントの場合、非表示フィールドにデータが指定されていない場合は、暗黙のデフォルト値ルールを使用して値が割り当てられます。

INSERT 文(REPLACE 文によるデータ挿入を含む)の場合、フィールド リストが指定されていない場合、空のリストが指定されている場合、またはフィールド リストに隠しフィールドが指定されていない場合は、暗黙のデフォルト値が割り当てられます。例えば:

テーブル t1 を作成します (col1 INT、col2 INT INVISIBLE)。
t1 VALUES(...) に挿入します。
t1() に値を挿入します(...);
t1 (col1) に値を挿入します(...);

最初の 2 つの INSERT ステートメントでは、VALUES() リストで各表示フィールドと非表示フィールドに値を指定する必要があります。 3 番目の INSERT ステートメントでは、VALUES() リストで指定された各フィールドに値を指定する必要があります。

LOAD DATA および LOAD XML ステートメントでは、フィールド リストが指定されていない場合、またはフィールド リストに非表示フィールドが指定されていない場合は、暗黙のデフォルト値が使用されます。入力データには隠しフィールドの値を含めることはできません。

上記のステートメントにデフォルト以外の値を指定する場合は、フィールド リストで非表示フィールドを明示的に指定し、VALUES() リストで値を指定できます。

INSERT INTO ... SELECT * および REPLACE INTO ... SELECT * には、* が隠しフィールドを返さないため、隠しフィールドは含まれません。暗黙のデフォルト値ルールも割り当てに使用されます。

PRIMARY KEY または UNIQUE インデックスに基づいてデータを挿入または無視、置換、または変更するステートメントでは、MySQL は非表示フィールドを表示フィールドと同じように扱います。非表示フィールドはキー値の比較にも使用されます。具体的には、新しい行の一意のキー フィールド値が既存の行と同じ場合、インデックス フィールドが表示されているかどうかに関係なく、次の処理が使用されます。

  • IGNORE 修飾子が指定されている場合、INSERT、LOAD DATA、および LOAD XML は新しいデータ行を無視します。
  • REPLACE 既存のデータ行を新しいデータ行に置き換えます。 REPLACE 修飾子が指定されている場合、LOAD DATA および LOAD XML でも同様です。
  • INSERT ... ON DUPLICATE KEY UPDATE は既存のデータ行を更新します。

UPDATE ステートメントを使用して非表示フィールドを更新する場合は、表示フィールドと同様に、明示的に値を割り当てることができます。

フィールドに関するメタデータを非表示にする

INFORMATION_SCHEMA.COLUMNS システム テーブルの EXTRA フィールドまたは SHOW COLUMNS コマンドを使用して、フィールドの表示プロパティを表示できます。例えば:

mysql> テーブル名、列名、追加項目を選択します
  INFORMATION_SCHEMA.COLUMNS から
  ここで、TABLE_SCHEMA = 'test'、TABLE_NAME = 't1';
+------------+-------------+------------+
| テーブル名 | 列名 | 追加 |
+------------+-------------+------------+
| t1 | 私 | |
| t1 | j | |
| t1 | k | 非表示 |
+------------+-------------+------------+

デフォルトではフィールドは表示されます。その場合、EXTRA フィールドは空になります。隠しフィールドの場合、EXTRA は明示的に INVISIBLE になります。

SHOW CREATE TABLE コマンドは、テーブル内の非表示の列を表示できます。列定義には、INVISIBLE キーワードを含むバージョンベースのコメントが含まれています。

mysql> SHOW CREATE TABLE t1_G
************************** 1. 行 ****************************
  表: t1
テーブルの作成: CREATE TABLE `t1` (
 `i` int デフォルト NULL、
 `j` int デフォルト NULL,
 `k` int デフォルト NULL /*!80023 非表示 */
) エンジン=InnoDB デフォルト文字セット=utf8mb4 照合=utf8mb4_0900_ai_ci

mysqldump と mysqlpump は SHOW CREATE TABLE コマンドを使用するため、エクスポートされるテーブル定義には非表示可能なフィールドが含まれます。また、エクスポートされたデータには隠しフィールドの値も含まれます。エクスポート ファイルが、隠しフィールドをサポートしていない古いバージョンの MySQL にロードされた場合、バージョン ベースのコメント情報は無視され、隠しフィールドが表示フィールドとして使用されます。

隠しフィールドとバイナリログ

バイナリ ログ内のイベントの場合、MySQL は隠しフィールドを次のように処理します。

  • テーブルを作成するイベントには、非表示フィールドの INVISIBLE 属性が含まれています。
  • 非表示フィールドと表示フィールドは、データ行イベントでは同じように処理されます。これらは、システム変数 binlog_row_image の設定に従って処理されます。
  • データ行イベントが適用されると、非表示フィールドは表示フィールドと同じように処理されます。使用されるアルゴリズムとインデックスは、システム変数 slave_rows_search_algorithms の設定に基づいて選択されます。
  • 書き込みセットを計算するとき、非表示フィールドは表示フィールドと同じように扱われます。書き込みセットには、非表示のフィールド定義に基づくインデックスが含まれます。
  • mysqlbinlog コマンドには、フィールド メタデータに表示される属性が含まれます。

要約する

これで、MySQL 8.0 の新機能である隠しフィールドに関するこの記事は終了です。MySQL 8.0 の隠しフィールドの詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL 8.0 の降順インデックス
  • MySQL 8の新機能である降順インデックスの基礎となる実装の詳細な説明
  • MySQL 8 の新機能: 降順インデックスの詳細
  • MySQL 8で追加された3つの新しいインデックスは、非表示、降順、関数です。

<<:  Vue v-onディレクティブの使用について

>>:  ウェブページの HTML コード: スクロールテキストの作成

推薦する

JS のあらゆる場所で絶対等価演算子の使用をやめる

目次概要1. NULL値のテスト2. ユーザー入力を読み取る導入事実の根源はどこにあるのでしょうか?...

Docker デプロイメント Springboot プロジェクト例の分析

この記事は主に、docker デプロイメント springboot プロジェクトのサンプル分析を紹介...

CentOS7 に MySQL をオフラインでインストールする詳細なチュートリアル

1. 元のmariadbを削除します。削除しないとmysqlをインストールできません。 mariad...

CSS エラスティック ボックス flex-grow、flex-shrink、flex-basis の詳細な説明

3 つの属性 flex-grow、flex-shrink、flex-basis の機能は次のとおりで...

MySQL プロジェクトでトランザクション分離レベルを選択する方法

導入コンテンツから始めましょう。誰もが次のような面接のシナリオに遭遇したことがあると思います。インタ...

Linuxのdateコマンドの使用

1. コマンドの紹介date コマンドは、現在の時刻または指定された時刻を指定された形式で表示するた...

MySQL 学習のまとめ: InnoDB ストレージ エンジンのアーキテクチャ設計の予備的な理解

1. ストレージエンジン前のセクションでは、SQL 実行プランは、エグゼキュータ コンポーネントがス...

Vueはシンプルなスライダー検証を実装する

この記事の例では、Vueスライダー検証の実装を共有しています。コードは次のとおりです。 <テン...

フックを使用して React コンポーネントを書くときに注意すべき 5 つの点

目次01. レンダリングが不要な場合はuseStateを使用する02. リンクの代わりにrouter...

Puppeteer を使用して Linux (CentOS) で Web ページのスクリーンショット機能を実装する

Linux に puppeteer をインストールするときに、次の問題が発生する可能性があります。こ...

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

この記事では、MySQL 8.0.13のインストールと設定のチュートリアルを参考までに紹介します。具...

CocosCreator 学習モジュールスクリプト

Cocos Creator モジュラースクリプトCocos Creator を使用すると、コードを複...

MySQL インデックスの種類 (通常、ユニーク、フルテキスト) の説明

MySQL のインデックスの種類には、通常のインデックス、一意のインデックス、全文インデックスがあり...

MySQL スロークエリ関連パラメータの原理の分析

MySQL スロー クエリ (正式名称はスロー クエリ ログ) は、MySQL によって提供されるロ...

Linux がますます人気になっている 10 の理由

Linux はますます多くのユーザーに愛されてきました。なぜ Linux はこれほど急速に発展し、い...