最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL 8.0新特性之隱藏字段的深入講解

 更新時(shí)間:2024年04月24日 09:52:46   作者:不剪發(fā)的Tony老師  
這篇文章主要給大家介紹了關(guān)于MySQL 8.0新特性之隱藏字段的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

MySQL 8.0.23 版本增加了一個(gè)新的功能:隱藏字段(Invisible Column),也稱為不可見字段。本文給大家介紹一下 MySQL 隱藏字段的相關(guān)概念和具體實(shí)現(xiàn)。

基本概念

隱藏字段需要在查詢中進(jìn)行顯式引用,否則對(duì)查詢而言是不可見的。MySQL 8.0.23 開始支持隱藏字段,在此之前所有的字段都是可見字段。

考慮以下應(yīng)用場(chǎng)景,假如一個(gè)應(yīng)用程序使用SELECT *語句訪問某個(gè)表,并且必需持續(xù)不斷地進(jìn)行查詢,即使我們?yōu)樵摫碓黾恿艘粋€(gè)該應(yīng)用不需要的新字段時(shí)也要求能夠正常工作。對(duì)于SELECT *查詢,星號(hào)(*)代表了表中除隱藏字段之外的所有字段,因此我們可以將新加的字段定義為隱藏字段。該隱藏字段對(duì)于SELECT *查詢是不可見的,因此應(yīng)用能夠繼續(xù)運(yùn)行。如果新版本的應(yīng)用程序需要使用該字段,可以在查詢中顯式指定。

PS:不推薦使用SELECT *語句查詢數(shù)據(jù),應(yīng)該明確指定需要返回的字段。

隱藏字段與 DDL 語句

默認(rèn)情況下創(chuàng)建的字段屬于可見字段。如果想要顯式指定字段的可見性,可以在CREATE TABLE或者ALTER TABLE語句中為字段的定義指定VISIBLE 或者 INVISIBLE 關(guān)鍵字。例如:

CREATE TABLE t1 (
 i INT,
 j DATE INVISIBLE
) ENGINE = InnoDB;
ALTER TABLE t1 ADD COLUMN k INT INVISIBLE;

如果想要修改某個(gè)字段的可見性,同樣可以使用 VISIBLE 或者 INVISIBLE 關(guān)鍵字。例如:

ALTER TABLE t1 CHANGE COLUMN j j DATE VISIBLE;
ALTER TABLE t1 MODIFY COLUMN j DATE INVISIBLE;
ALTER TABLE t1 ALTER COLUMN j SET VISIBLE;

使用隱藏字段時(shí),需要注意以下事項(xiàng):

  • 一個(gè)表至少需要一個(gè)可見字段。如果將所有字段都設(shè)置為隱藏字段,將會(huì)返回錯(cuò)誤。
  • 隱藏字段支持常見的字段屬性:NULL、NOT NULL 以及 AUTO_INCREMENT 等等。
  • 計(jì)算列(Generated column)可以是隱藏字段。
  • 索引可以使用隱藏字段,包括 PRIMARY KEY 和 UNIQUE 索引。雖然一個(gè)表至少需要一個(gè)可見字段,但是索引定義中可以不包含任何可見字段。
  • 刪除某個(gè)表中的隱藏字段時(shí),同時(shí)會(huì)從相關(guān)索引中刪除該字段。
  • 外鍵約束可以基于隱藏字段進(jìn)行定義,同時(shí)外鍵約束也可以引用隱藏字段。
  • CHECK 約束可以基于隱藏字段進(jìn)行定義。插入或者更新數(shù)據(jù)時(shí),如果違反了隱藏字段上的 CHECK 約束將會(huì)返回錯(cuò)誤。

如果使用CREATE TABLE ... LIKE語句復(fù)制表結(jié)構(gòu),將會(huì)復(fù)制原表中的隱藏字段,而且它們?cè)谛卤碇腥匀皇请[藏字段。如果使用CREATE TABLE ... SELECT語句復(fù)制表,不會(huì)包含隱藏字段,除非顯式指定了隱藏字段。盡管如此,即使包含了原表中的隱藏字段,新表中的這些字段將會(huì)變成可見字段。例如:

mysql> CREATE TABLE t1 (col1 INT, col2 INT INVISIBLE);
mysql> CREATE TABLE t2 AS SELECT col1, col2 FROM t1;
mysql> SHOW CREATE TABLE t2\G
*************************** 1. row ***************************
  Table: t2
Create Table: CREATE TABLE `t2` (
 `col1` int DEFAULT NULL,
 `col2` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

如果想要保留這些字段的隱藏屬性,可以在 CREATE TABLE 之后為它們指定隱藏屬性。例如:

mysql> CREATE TABLE 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. row ***************************
  Table: t2
Create Table: CREATE TABLE `t2` (
 `col1` int DEFAULT NULL,
 `col2` int DEFAULT NULL /*!80023 INVISIBLE */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

視圖可以引用隱藏字段,需要在定義中顯式指定這些字段。在視圖定義之后修改字段的可見性不會(huì)影響視圖。

隱藏字段與 DML 語句

對(duì)于 SELECT 語句,除非在查詢列表中顯式指定了隱藏字段,否則查詢結(jié)構(gòu)中不會(huì)包含隱藏字段。查詢列表中的 * 和 tbl_name.* 不會(huì)包含隱藏字段。自然連接不會(huì)包含隱藏字段。

對(duì)于以下語句:

mysql> CREATE TABLE t1 (col1 INT, col2 INT INVISIBLE);
mysql> INSERT INTO t1 (col1, col2) VALUES(1, 2), (3, 4);

mysql> SELECT * FROM t1;
+------+
| col1 |
+------+
| 1 |
| 3 |
+------+

mysql> SELECT col1, col2 FROM t1;
+------+------+
| col1 | col2 |
+------+------+
| 1 | 2 |
| 3 | 4 |
+------+------+

第一個(gè) SELECT 語句沒有引用隱藏字段 col2(* 不包含隱藏字段),因此查詢結(jié)果中沒有返回 col2 字段。第二個(gè) SELECT 語句顯式指定了 col2 字段,因此查詢結(jié)果返回了該字段。

對(duì)于查詢語句,如果沒有為隱藏字段指定數(shù)據(jù),使用隱式默認(rèn)值規(guī)則進(jìn)行賦值。

對(duì)于 INSERT 語句(包括 REPLACE 語句的數(shù)據(jù)插入),如果沒有指定字段列表、指定空白列表或者沒有在字段列表中指定隱藏字段時(shí),使用隱式默認(rèn)值賦值。例如:

CREATE TABLE t1 (col1 INT, col2 INT INVISIBLE);
INSERT INTO t1 VALUES(...);
INSERT INTO t1 () VALUES(...);
INSERT INTO t1 (col1) VALUES(...);

對(duì)于前兩個(gè) INSERT 語句,VALUES() 列表必須為每個(gè)可見字段和隱藏字段提供一個(gè)數(shù)值。對(duì)于第三個(gè) INSERT 語句,VALUES() 列表必須為每個(gè)指定的字段提供一個(gè)數(shù)值。

對(duì)于 LOAD DATA 和 LOAD XML 語句,如果沒有指定字段列表或者沒有在字段列表中指定隱藏字段時(shí),使用隱式默認(rèn)值賦值。輸入數(shù)據(jù)中不能包含隱藏字段的值。

如果想要為上面的語句提供一個(gè)非默認(rèn)的數(shù)據(jù),可以在字段列表中顯式指定隱藏字段并且在 VALUES() 列表中指定一個(gè)數(shù)值。

INSERT INTO … SELECT * 和 REPLACE INTO … SELECT * 不會(huì)包含隱藏字段,因?yàn)?* 不會(huì)返回隱藏字段。此時(shí)同樣會(huì)使用隱式默認(rèn)值規(guī)則進(jìn)行賦值。

基于 PRIMARY KEY 或者 UNIQUE 索引執(zhí)行插入或者忽略插入、替換或者修改數(shù)據(jù)的語句中,MySQL 對(duì)隱藏字段的處理方式和可見字段相同:隱藏字段同樣會(huì)用于鍵值的比較。準(zhǔn)確來說,如果某個(gè)新的數(shù)據(jù)行和已有數(shù)據(jù)行的唯一鍵字段值相同,無論索引字段是否可見,都會(huì)使用以下處理方式:

  • 如果指定了 IGNORE 修飾符,INSERT、LOAD DATA 以及 LOAD XML 都會(huì)忽略新的數(shù)據(jù)行。
  • REPLACE 使用新的數(shù)據(jù)行替換原有的數(shù)據(jù)行。如果指定了 REPLACE 修飾符,LOAD DATA 和 LOAD XML 也是如此。
  • INSERT … ON DUPLICATE KEY UPDATE 更新原有的數(shù)據(jù)行。

如果想要使用 UPDATE 語句更新隱藏字段,像可見字段一樣顯式進(jìn)行賦值即可。

隱藏字段相關(guān)的元數(shù)據(jù)

我們可以通過 INFORMATION_SCHEMA.COLUMNS 系統(tǒng)表的 EXTRA 字段或者 SHOW COLUMNS 命令查看字段的可見屬性。例如:

mysql> SELECT TABLE_NAME, COLUMN_NAME, EXTRA
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE TABLE_SCHEMA = 'test' AND TABLE_NAME = 't1';
+------------+-------------+-----------+
| TABLE_NAME | COLUMN_NAME | EXTRA  |
+------------+-------------+-----------+
| t1   | i   |   |
| t1   | j   |   |
| t1   | k   | INVISIBLE |
+------------+-------------+-----------+

默認(rèn)情況下字段是可見的,此時(shí) EXTRA 字段為空。對(duì)于隱藏字段,EXTRA 顯式為 INVISIBLE。

SHOW CREATE TABLE 命令可以顯式表中的隱藏字段,字段定義中包含一個(gè)基于版本的注釋,其中包含了一個(gè) INVISIBLE 關(guān)鍵字:

mysql> SHOW CREATE TABLE t1\G
*************************** 1. row ***************************
  Table: t1
Create Table: CREATE TABLE `t1` (
 `i` int DEFAULT NULL,
 `j` int DEFAULT NULL,
 `k` int DEFAULT NULL /*!80023 INVISIBLE */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

mysqldump 和 mysqlpump 使用 SHOW CREATE TABLE 命令,因此它們導(dǎo)出的表定義中包含可隱藏字段。同時(shí),它們?cè)趯?dǎo)出的數(shù)據(jù)中包含了隱藏字段的值。如果將導(dǎo)出文件加載到不支持的隱藏字段的低版本 MySQL 中,將會(huì)忽略基于版本的注釋信息,從而將隱藏字段作為可見字段使用。

隱藏字段與二進(jìn)制日志

對(duì)于二進(jìn)制日志中的事件,MySQL 使用以下方式處理隱藏字段:

  • 創(chuàng)建表的事件中包含了隱藏字段的 INVISIBLE 屬性。
  • 數(shù)據(jù)行事件中的隱藏字段和可見字段處理方式相同。它們會(huì)根據(jù)系統(tǒng)變量 binlog_row_image 的設(shè)置進(jìn)行處理。
  • 當(dāng)數(shù)據(jù)行事件被應(yīng)用時(shí),隱藏字段和可見字段處理方式相同。其中,使用的算法和索引基于系統(tǒng)變量 slave_rows_search_algorithms 的設(shè)置進(jìn)行選擇。
  • 計(jì)算寫入集(writeset)時(shí)隱藏字段和可見字段處理方式相同。寫入集中包含了基于隱藏字段定義的索引。
  • mysqlbinlog 命令中包含了字段元數(shù)據(jù)中的可見屬性。

總結(jié)

到此這篇關(guān)于MySQL 8.0新特性之隱藏字段的文章就介紹到這了,更多相關(guān)MySQL8.0隱藏字段內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql中coalesce()的使用技巧小結(jié)

    mysql中coalesce()的使用技巧小結(jié)

    在mysql中,其實(shí)有不少方法和函數(shù)是很有用的,這次介紹一個(gè)叫coalesce的,拼寫十分麻煩,但其實(shí)作用是將返回傳入的參數(shù)中第一個(gè)非null的值,下面這篇文章主要給大家介紹了在mysql中coalesce()使用技巧的相關(guān)資料,需要的朋友可以參考下。
    2017-06-06
  • 基于mysq字段選擇的詳解

    基于mysq字段選擇的詳解

    本篇文章是對(duì)mysq字段選擇進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • 詳解MySQL查詢時(shí)區(qū)分字符串中字母大小寫的方法

    詳解MySQL查詢時(shí)區(qū)分字符串中字母大小寫的方法

    MySQL默認(rèn)是不區(qū)分大小寫的,這個(gè)涉及到collate字符集與校驗(yàn)規(guī)則方面的知識(shí),下面會(huì)講到,這里我們就來詳解MySQL查詢時(shí)區(qū)分字符串中字母大小寫的方法.
    2016-05-05
  • MySQL 8 新特性之Invisible Indexes

    MySQL 8 新特性之Invisible Indexes

    這篇文章主要介紹了MySQL 8 新特性之Invisible Indexes 的相關(guān)資料,需要的朋友可以參考下
    2018-05-05
  • MySQL如何實(shí)現(xiàn)事務(wù)的ACID

    MySQL如何實(shí)現(xiàn)事務(wù)的ACID

    這篇文章主要介紹了MySQL如何實(shí)現(xiàn)事務(wù)的四大特性,幫助大家更好的理解和學(xué)習(xí)MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下
    2020-09-09
  • 基于Php mysql存儲(chǔ)過程的詳解

    基于Php mysql存儲(chǔ)過程的詳解

    本篇文章是對(duì)Php中的mysql存儲(chǔ)過程進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • MySQL中RANK()函數(shù)的介紹和用法

    MySQL中RANK()函數(shù)的介紹和用法

    這篇文章主要介紹了MySQL中RANK()的介紹和用法,通過RANK()函數(shù),我們可以方便地為查詢結(jié)果進(jìn)行排序并為每個(gè)行分配排名,本文介紹了RANK()函數(shù)的概念和使用方法,并通過示例和輸出結(jié)果向讀者展示了具體的操作步驟和效果,感興趣的朋友一起看看吧
    2023-07-07
  • Mysql中強(qiáng)制索引的具體使用

    Mysql中強(qiáng)制索引的具體使用

    Mysql強(qiáng)制索引可以通過強(qiáng)制使用某些列的索引來提高查詢的性能,本文就來介紹一下Mysql中強(qiáng)制索引的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-08-08
  • 詳解MySQL批量入庫的幾種方式

    詳解MySQL批量入庫的幾種方式

    本文主要介紹了詳解MySQL批量入庫的幾種方式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • mysql sharding(碎片)介紹

    mysql sharding(碎片)介紹

    這篇文章主要介紹了mysql sharding(碎片)介紹,本文講解了Sharding的應(yīng)用場(chǎng)景一般都哪些、Sharding與數(shù)據(jù)庫分區(qū)(Partition)的區(qū)別等內(nèi)容,需要的朋友可以參考下
    2015-03-03

最新評(píng)論

治多县| 宕昌县| 宣汉县| 城市| 台北县| 濮阳县| 乌恰县| 神农架林区| 富裕县| 汶川县| 西盟| 北安市| 丽水市| 廊坊市| 南和县| 化隆| 哈密市| 同心县| 宜州市| 汝南县| 枣庄市| 富阳市| 陵川县| 惠水县| 平乐县| 普陀区| 乌什县| 铅山县| 黎城县| 南部县| 讷河市| 泗水县| 交城县| 普宁市| 孙吴县| 曲阜市| 博野县| 荣昌县| 习水县| 靖宇县| 西华县|