序文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 に設定します。 隠しフィールドを使用する場合は、次の点に注意してください。
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 は非表示フィールドを表示フィールドと同じように扱います。非表示フィールドはキー値の比較にも使用されます。具体的には、新しい行の一意のキー フィールド値が既存の行と同じ場合、インデックス フィールドが表示されているかどうかに関係なく、次の処理が使用されます。
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 は隠しフィールドを次のように処理します。
要約するこれで、MySQL 8.0 の新機能である隠しフィールドに関するこの記事は終了です。MySQL 8.0 の隠しフィールドの詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
>>: ウェブページの HTML コード: スクロールテキストの作成
目次概要1. NULL値のテスト2. ユーザー入力を読み取る導入事実の根源はどこにあるのでしょうか?...
この記事は主に、docker デプロイメント springboot プロジェクトのサンプル分析を紹介...
1. 元のmariadbを削除します。削除しないとmysqlをインストールできません。 mariad...
3 つの属性 flex-grow、flex-shrink、flex-basis の機能は次のとおりで...
導入コンテンツから始めましょう。誰もが次のような面接のシナリオに遭遇したことがあると思います。インタ...
1. コマンドの紹介date コマンドは、現在の時刻または指定された時刻を指定された形式で表示するた...
1. ストレージエンジン前のセクションでは、SQL 実行プランは、エグゼキュータ コンポーネントがス...
この記事の例では、Vueスライダー検証の実装を共有しています。コードは次のとおりです。 <テン...
目次01. レンダリングが不要な場合はuseStateを使用する02. リンクの代わりにrouter...
Linux に puppeteer をインストールするときに、次の問題が発生する可能性があります。こ...
この記事では、MySQL 8.0.13のインストールと設定のチュートリアルを参考までに紹介します。具...
Cocos Creator モジュラースクリプトCocos Creator を使用すると、コードを複...
MySQL のインデックスの種類には、通常のインデックス、一意のインデックス、全文インデックスがあり...
MySQL スロー クエリ (正式名称はスロー クエリ ログ) は、MySQL によって提供されるロ...
Linux はますます多くのユーザーに愛されてきました。なぜ Linux はこれほど急速に発展し、い...