alter table ba_bgt_info add v_is_auto varchar(300) generated always AS(manage_categories-"$.isAuto")

創(chuàng)新互聯(lián)建站長(zhǎng)期為成百上千家客戶(hù)提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為洞口企業(yè)提供專(zhuān)業(yè)的成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè),洞口網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。
在MySQL 5.7中,支持兩種Generated Column,即Virtual Generated Column和Stored Generated Column,前者只將Generated Column保存在數(shù)據(jù)字典中(表的元數(shù)據(jù)),并不會(huì)將這一列數(shù)據(jù)持久化到磁盤(pán)上;后者會(huì)將Generated Column持久化到磁盤(pán)上,而不是每次讀取的時(shí)候計(jì)算所得。很明顯,后者存放了可以通過(guò)已有數(shù)據(jù)計(jì)算而得的數(shù)據(jù),需要更多的磁盤(pán)空間,與Virtual Column相比并沒(méi)有優(yōu)勢(shì),因此,MySQL 5.7中,不指定Generated Column的類(lèi)型,默認(rèn)是Virtual Column。
如果需要Stored Generated Golumn的話(huà),可以在Virtual Generated Column上建立索引更加合適
綜上,一般情況下,都使用Virtual Generated Column,這也是MySQL默認(rèn)的方式
能正常加索引、特殊用途冗余列、列長(zhǎng)度還是和定義類(lèi)型一樣、查詢(xún)效率上,物理STOREDVIRTUAL
虛擬列: 一個(gè)或多個(gè)字段的數(shù)據(jù)函數(shù)處理后的結(jié)果集映射成的字段
視圖: 一個(gè)或多個(gè)表依照某個(gè)條件組合而成的結(jié)果集(相當(dāng)于一個(gè)查詢(xún)sql語(yǔ)句的結(jié)果集映射成的虛擬表)
其本質(zhì)其實(shí)都是以空間換時(shí)間
什么是視圖?視圖是干什么用的?
視圖(view)是一種虛擬存在的表,是一個(gè)邏輯表,本身并不包含數(shù)據(jù)。作為一個(gè)select語(yǔ)句保存在數(shù)據(jù)字典中的。
通過(guò)視圖,可以展現(xiàn)基表的部分?jǐn)?shù)據(jù);視圖數(shù)據(jù)來(lái)自定義視圖的查詢(xún)中使用的表,使用視圖動(dòng)態(tài)生成。
基表: 用來(lái)創(chuàng)建視圖的表叫做基表base table
因?yàn)橐晥D的諸多優(yōu)點(diǎn),如下
總而言之,使用視圖的大部分情況是為了保障數(shù)據(jù)安全性,提高查詢(xún)效率。
對(duì)于想要將自動(dòng)生成的數(shù)據(jù)添加到表中的任何人來(lái)說(shuō), MySQL 虛擬列 是一個(gè)強(qiáng)大、易于使用和高級(jí)的功能。
INSERT 生成的列允許您在不使用and UPDATE 子句的情況下將自動(dòng)生成的數(shù)據(jù)存儲(chǔ)在表中。 這個(gè)有用的特性自 5.7 版 起就已成為 MySQL 的一部分,它代表了在生成數(shù)據(jù)時(shí)觸發(fā)器的另一種方法。此外,生成的列可以幫助您更輕松、更高效地查詢(xún)。
虛擬列 列類(lèi)似于普通列,但您不能手動(dòng)更改其值。這是因?yàn)楸磉_(dá)式定義了如何根據(jù)從同一行的其他列中讀取的其他值來(lái)生成生成列的值。因此,生成的列在表的域內(nèi)工作,其定義不能涉及 JOIN 語(yǔ)句。
換句話(huà)說(shuō),您可以將生成的列視為一種視圖,但僅限于列。請(qǐng)注意,生成的列與 SQL 觸發(fā)器 不同,您只能在使用 CREATE TABLE or語(yǔ)句時(shí)定義它們,語(yǔ)法如下: ALTER TABLE
該 AS (generated_column_expression) 子句指定要添加或更新到表中的列是生成的列。定義 MySQL 將用于計(jì)算列值的 generation_expression 表達(dá)式,它不能引用另一個(gè)生成的列或除當(dāng)前表的列之外的任何內(nèi)容。另外,請(qǐng)注意生成表達(dá)式只能涉及不可變函數(shù)。例如,您不能在生成的列表達(dá)式定義中使用返回當(dāng)前日期的函數(shù),因?yàn)樗且粋€(gè)可變函數(shù)。
您還可以在關(guān)鍵字前面 AS 加上 GENERATED ALWAYS 關(guān)鍵字以使生成的列的性質(zhì)更加明確,但這是可選的。然后,您可以指示生成列的類(lèi)型是 VIRTUAL 還是 STORED 。您將在下面的章節(jié)中了解這兩種類(lèi)型之間的區(qū)別。默認(rèn)情況下,如果沒(méi)有在查詢(xún)中明確指定,MySQL 會(huì)將生成的列標(biāo)記為 VIRTUAL .
現(xiàn)在讓我們看看生成的列語(yǔ)法在 CREATE TABLE 查詢(xún)中的作用:
在此示例中,該 full_name 列將自動(dòng)存儲(chǔ) first_name 和 last_name 列的連接。
如前所述,您可以將生成的列定義為 VIRTUAL 或 STORED。現(xiàn)在讓我們仔細(xì)看看這兩種類(lèi)型。
MySQL 不存儲(chǔ)標(biāo)記為 VIRTUAL 的 虛擬列 。這意味著 MySQL 在需要時(shí)動(dòng)態(tài)評(píng)估其值。 BEFORE 這通常在觸發(fā)任何查詢(xún)后立即發(fā)生。換句話(huà)說(shuō),虛擬生成的列不占用存儲(chǔ)空間。
MySQL 存儲(chǔ)任何生成的標(biāo)記為 STORED 的列。這意味著每次插入或更新行時(shí),MySQL 都會(huì)評(píng)估其值并將其存儲(chǔ)在磁盤(pán)上。換句話(huà)說(shuō),存儲(chǔ)列需要存儲(chǔ)空間,就好像它是普通列一樣。
現(xiàn)在讓我們進(jìn)一步了解虛擬列和存儲(chǔ)生成列的優(yōu)缺點(diǎn)。
優(yōu)點(diǎn)
缺點(diǎn)
優(yōu)點(diǎn)
缺點(diǎn)
采用生成的列有幾個(gè)原因,但以下三個(gè)是最重要的。
如您所見(jiàn),您可以通過(guò)將四列與以下生成的列聚合來(lái)輕松生成此數(shù)據(jù)字段:
這將產(chǎn)生:
在這種情況下,生成的列使您能夠直接在數(shù)據(jù)庫(kù)級(jí)別標(biāo)準(zhǔn)化數(shù)據(jù)字段格式。此外,存儲(chǔ)生成的列避免了每次需要時(shí)都構(gòu)造此字段的不可避免的開(kāi)銷(xiāo)。
通常,您使用網(wǎng)站 URL 中的資源 ID 或REST API來(lái)檢索您需要的數(shù)據(jù)。但是公開(kāi)暴露您的 ID 可能會(huì)帶來(lái)安全問(wèn)題。當(dāng)您發(fā)現(xiàn)自己使用自動(dòng)增量 ID 時(shí)尤其如此,這很容易預(yù)測(cè)并使抓取或機(jī)器人攻擊更容易。
為避免這種情況,您可以考慮通過(guò)使用自動(dòng)生成的、隨機(jī)的、更安全的公共 ID 來(lái)隱藏您的原始 ID。您可以通過(guò)對(duì)您的 ID 進(jìn)行散列處理,使用虛擬生成的列來(lái)實(shí)現(xiàn)這一點(diǎn),如下所示:
請(qǐng)注意,為避免生成已知的哈希值,您可以將您的 ID 與特殊關(guān)鍵字連接起來(lái)。 在此處了解有關(guān) MySQL 加密和壓縮功能的更多信息。
過(guò)濾數(shù)據(jù)時(shí),有些列比其他列更有用。此外,您通常必須更改存儲(chǔ)在列中的值的表示形式,以使過(guò)濾更簡(jiǎn)單或更直觀。您可以定義一個(gè)有用的生成列來(lái)存儲(chǔ)以所需格式執(zhí)行過(guò)濾所需的信息,而不是在每個(gè)過(guò)濾器查詢(xún)中執(zhí)行此操作。
例如,您可以定義一個(gè)生成的列,以便更輕松地找到籃球隊(duì)中的球員,如下所示:
這樣的列將產(chǎn)生:
如前所述,您只能在表中使用生成的列。此外,它們只能涉及不可變函數(shù),并且MySQL 生成它們的值以響應(yīng) INSERT or UPDATE 查詢(xún)。另一方面,觸發(fā)器是 MySQL 自動(dòng)執(zhí)行的存儲(chǔ)程序,每當(dāng)與特定表關(guān)聯(lián)的 或 事件發(fā)生 INSERT 時(shí) UPDATE 。 DELETE 換句話(huà)說(shuō),觸發(fā)器可以涉及多個(gè)表和所有 MySQL 函數(shù)。與生成的列相比,這使它們成為更完整的解決方案。同時(shí),MySQL 觸發(fā)器本質(zhì)上使用和定義更復(fù)雜,也比生成的列慢。
從MySQL 5.7開(kāi)始,支持兩種Generated Column,即Virtual Generated Column和Stored Generated Column;
CREATE TABLE t1 (c1 INT);
ALTER TABLE t1 ADD COLUMN c2 INT GENERATED ALWAYS AS (c1 + 1) STORED;
CREATE TABLE t1 (c1 INT, c2 INT GENERATED ALWAYS AS (c1 + 1) STORED);
1、主鍵索引不能包含virtual generated column 如:
mysql create table t(a int, b int , c int as (a / b), primary key(c));
ERROR 3106 (HY000): 'Defining a virtual generated column as primary key' is not supported for generated columns.
2、Virtual Generated Column不能作為外鍵
3、不能使用非確定函數(shù),如:
mysql alter table a ADD p3 DATE GENERATED ALWAYS AS (curtime()) virtual;
ERROR 3763 (HY000): Expression of generated column 'p3' contains a disallowed function: curtime.
4、無(wú)法刪除源列,如:
mysql alter table t100w drop k1;
ERROR 3108 (HY000): Column 'k1' has a generated column dependency.
5、非法數(shù)據(jù),如:
mysql create table t( x int, y int, z int as( x / 0));
Query OK, 0 rows affected (0.22 sec)
mysql insert into t(x,y) values(1,1);
ERROR 1365 (22012): Division by 0
測(cè)試sql:
SELECT test_vv FROM t100w limit 10000; #虛擬列無(wú)索引
虛擬列函數(shù):
(concat( k1 ,_utf8mb4'-', k2 ))
myql 在實(shí)戰(zhàn)使用過(guò)程中會(huì)遇到不同的場(chǎng)景,針對(duì)不同場(chǎng)景,使用方式需要整理記錄,給以后遇到類(lèi)似問(wèn)題做參考使用。
這里主要是對(duì)dual虛擬表的一種認(rèn)識(shí)。實(shí)際上可以直接函數(shù)方式:
【場(chǎng)景描述】
類(lèi)似手機(jī)號(hào),需要中間4位 ‘*’ 處理。如:“ 187****4567 ”,姓名3個(gè)字的中間1位 ‘*’ 處理,2個(gè)字的后面1位 ‘*’處理。如: “ 李 * , 張*研 ”
【實(shí)現(xiàn)方式】
(1) insert(mobile, 4,4,'****') :函數(shù)
(2) concat(left(mobile,3), '****', right(mobile,4)) :聯(lián)接函數(shù)
(3) REPLACE(mobile, SUBSTR(mobile,4,4), '****') :替換函數(shù)
【實(shí)現(xiàn)語(yǔ)句】
UNION在mysql中被稱(chēng)為集合操作,操作類(lèi)型分為兩種:UNION DISTINCT 和? UNION ALL;注意:UNION和UNION DISTINCT是一樣的功能。UNION功能為合并多個(gè)查詢(xún)的結(jié)果并去重,UNION ALL的功能為合并多個(gè)查詢(xún)的結(jié)果不去重。
集合操作時(shí),兩邊的輸入必須擁有相同的列數(shù),如果數(shù)據(jù)類(lèi)型不同的話(huà),mysql會(huì)自動(dòng)進(jìn)行隱式轉(zhuǎn)化 ;同時(shí),結(jié)果列的名稱(chēng)由第一個(gè)查詢(xún)的列的名稱(chēng)決定。下面看一下例子:
sql語(yǔ)句為:SELECT 'abc' as o,'haha' as p,4 as q FROM DUAL UNION SELECT 'abc' as a,'haha',4 FROM DUAL;結(jié)果是:
如果是:SELECT 'abc' as o,'haha' as p,4 as q FROM DUAL UNION ALL SELECT 'abc' as a,'haha',4 FROM DUAL;
如果兩次查詢(xún)的列個(gè)數(shù)不一致,如:SELECT 'abc' as o,'haha' as p,4 as q FROM DUAL UNION ALL SELECT 'abc' as a,'haha' FROM DUAL;
在多個(gè)列查詢(xún)時(shí),只要有一個(gè)列的數(shù)據(jù)不一致時(shí),都是無(wú)法去重的;也就是去重是每個(gè)列的數(shù)據(jù)完全一致,比如:SELECT 'abc' as o,'haha' as p,4 as q FROM DUAL UNION DISTINCT SELECT 'abc' as a,'haha',5 FROM DUAL;
這幾個(gè)例子可以看出UNION (DISTINCT) 與 UNION ALL的用法了吧,下面講一下UNION (DISTINCT)的實(shí)現(xiàn)方式:
一:創(chuàng)建一張?zhí)摂M表;
二:對(duì)這張?zhí)摂M表的列添加唯一索引,即UNIQUE INDEX;
三:將結(jié)果插入虛擬表
四:返回虛擬表;?
如何判斷是否創(chuàng)建一個(gè)虛擬表,我們可以通過(guò)一下語(yǔ)句判斷:
SHOW STATUS LIKE 'Created_tmp_tables';?
SELECT 'abc' as o,'haha' as p,4 as q FROM DUAL UNION SELECT 'abc' as a,'haha',4 FROM DUAL;
SHOW STATUS LIKE 'Created_tmp_tables'; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 結(jié)果是:
可見(jiàn)結(jié)果3比結(jié)果1多1,在操作第二個(gè) UNION語(yǔ)句時(shí)創(chuàng)建了一個(gè)虛擬表;如果UNION創(chuàng)建了索引,插入會(huì)相對(duì)變慢
可以用兩表的查詢(xún)結(jié)果集做為一個(gè)虛擬表(為其取一個(gè)表別名),然后再用該虛擬表與另一張表實(shí)施連接查詢(xún)即可。請(qǐng)參考以下例子:
假設(shè)有三張表
1)商品表(商品ID,商品名稱(chēng))
2)入庫(kù)表(商品ID,入庫(kù)數(shù)量,入庫(kù)時(shí)間)
3)出庫(kù)表(商品ID,出庫(kù)數(shù)量,出庫(kù)時(shí)間)
要求列出所有商品名稱(chēng)、商品ID及其當(dāng)前庫(kù)存余額
SQL查詢(xún)語(yǔ)句如下:
select 商品表.商品名稱(chēng),商品表.商品ID,b.庫(kù)存余額
from 商品表 left join
(select a.商品ID,sum(a.數(shù)量)as 庫(kù)存余額 from
(select 商品ID,入庫(kù)數(shù)量 as 數(shù)量 from 入庫(kù)表 union all
select 商品ID,-1*出庫(kù)數(shù)量 from 出庫(kù)表) a group by a.商品ID) b
on 商品表.商品ID=b.商品ID;
-- 說(shuō)明上述語(yǔ)句中的“a”和“b”分別是兩個(gè)中間過(guò)渡查詢(xún)結(jié)果集取的表別名,也就所謂的虛擬表。
網(wǎng)站標(biāo)題:mysql怎么使用虛擬表 sql創(chuàng)建虛擬表
標(biāo)題鏈接:http://chinadenli.net/article16/hjoigg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、搜索引擎優(yōu)化、網(wǎng)站改版、品牌網(wǎng)站建設(shè)、建站公司、Google
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容
網(wǎng)頁(yè)設(shè)計(jì)公司知識(shí)