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 コード: スクロールテキストの作成

推薦する

MySQLの文字セットを変更する方法

1. MySQLの文字セットを確認する '%char%' のような変数を表示します。...

Linux サーバーが処理できる接続数をご存知ですか?

序文まず、TCP 接続を識別する方法を見てみましょう。システムは、(src_ip、src_port、...

Vue の一般的な問題と解決策の概要 (推奨)

Vue に限定されず、他の種類の SPA プロジェクトにも当てはまる問題がいくつかあります。 1....

Windows での MySQL インストール チュートリアル (画像とテキスト付き)

MySQL インストール手順 MySQL は、スウェーデンの MySQL AB によって開発された...

Nginx のリロード プロセスの背後にある真実を探る

本日の記事では、主にNginxのリロードプロセスについて紹介します。実は前回の記事では、nginx ...

Linux でテキストを表示するためのヒント (非常に実用的!)

序文日常の開発では、サーバー上でさまざまなテキストやログの表示操作を実行する必要があることがよくあり...

Vue.js で AntV X6 を使用する手順の例

目次0x0 はじめに0x1 インストール0x2 ノードサイドバー0x3 統合例0x0 はじめにプロジ...

よく使うLinuxコマンドのまとめ

私は2年間運用保守に携わり、多くのコマンドを使用しました。特定のLinuxコマンドを習得すると、どれ...

スネークゲームのウェブ版を実装するためのJavaScript

この記事では、ウェブページのスネークゲームを実装するためのJavaScriptの具体的なコードを参考...

JavaScript実行メカニズムの詳細な紹介

目次1. プロセスとスレッドの概念2. ブラウザの原則3. 同期と非同期4. 実行スタックとタスクキ...

Vueはel-tableを使用して列と行を動的に結合します

この記事の例では、el-tableを使用して列と行を動的にマージするVueの具体的なコードを参考まで...

仕事の効率を上げるJS略語スキル20選

目次複数の変数を同時に宣言する場合は、1 行に短縮できます。分割代入は複数の変数に同時に値を割り当て...

Linux ユーザー スクリプトの作成/推測ゲーム/ネットワーク カード トラフィック監視の紹介

目次1. ユーザーが作成したスクリプト2. 単語当てゲーム3. ネットワークカードのトラフィック監視...

Nginx ストリーム構成プロキシ (Nginx TCP/UDP ロード バランシング)

序章nginx が優れたリバース プロキシ サービスであることは誰もが知っています。nginx を使...

bodyタグの主な属性の概要

bgcolor="テキストの色" background="背景画像&q...