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

推薦する

Taobao の商品画像切り替え効果を実現する JavaScript

JavaScriptの服装アルバム切り替え効果(Taobao商品画像切り替えに似ています)、参考ま...

ジョセフリング問題を解決する 3 つの JavaScript メソッド

目次概要問題の説明循環リンクリスト順序付き配列数学的再帰要約する概要ジョセフ・リング問題は、ジョセフ...

Vue でのルーティングガードの具体的な使用法

目次1. グローバルガード1.1 グローバルフロントガード1.2 グローバルポストルートガード1.3...

ECMAScript のイテレータの詳細な説明

目次序文以前のバージョンイテレータパターンイテレータファクトリ関数イテレータプロトコル最後に序文多く...

vue+element カスタムクエリコンポーネント

この記事では主に Vue プロジェクトを紹介します。要素の導入を前提として、コンポーネントを 2 回...

MySQLはランダムに一定数のレコードを抽出します

以前は、このような使用シナリオを処理するために rand() で直接 order していましたが、効...

MySQL 5.6 ルートパスワード変更チュートリアル

1. MySQL 5.6をインストールした後、正常に有効化できないMySQL の圧縮バージョンは、解...

Reactを使用して画像認識アプリを実装する方法

まずは効果の写真をお見せしましょう。 個人的には効果は問題ないと思います。アプリが写真を学習する時間...

Vue2.0は適応解像度を実装する

この記事では、適応解像度を実現するためのVue2.0の具体的なコードを参考までに紹介します。具体的な...

Maven プロジェクトのリモート デプロイメント && Tomcat を使用してデータベース接続を構成する方法

1つ。 tomcat を使用したリモート展開1.1 発生した問題:プロジェクトでは、サードパーティの...

HTML テーブル マークアップ チュートリアル (43): テーブル ヘッダーの VALIGN 属性

垂直方向では、ヘッダーの配置を上、中央、下に設定できます。基本的な構文構文Top は上、Middle...

Oracle VM VirtualBox の CentOS7 オペレーティング システムのインストール チュートリアル図

目次インストール手順環境設定実行構成インストール手順ダウンロードアドレス: バージョン6.0 最初に...

22 Vue 最適化のヒント (プロジェクトの実践)

目次コードの最適化v-for でキーを使用するv-if/v-else-if/v-else でキーを使...

Vue ライフサイクルの紹介とフック関数の詳細な説明

目次Vueライフサイクルの紹介とフック機能VUEライフサイクルフックVue ライフサイクルの紹介作成...

MySQL メモリテーブルと一時テーブルの使用方法の詳細な説明

MySQL メモリ テーブルと一時テーブルの使用メモリテーブル: セッション 1 $ mysql -...