Mysql視圖和觸發(fā)器使用過(guò)程
視圖
視圖是什么, 是否真實(shí)存在?
個(gè)人理解:視圖視圖,只是你可以看見(jiàn)的一層抽象層, 它并不真實(shí)存在, 而是在真實(shí)存在的一張或者多張表之上的一層封裝, 對(duì)于select查詢(xún)語(yǔ)句的提前封裝. 不涉及數(shù)據(jù)的存儲(chǔ).
這樣的一層封裝好處是蠻多的. 對(duì)于復(fù)雜查詢(xún)操作語(yǔ)句的簡(jiǎn)化 --- 方便后序使用.
安全性,我們?cè)谑褂靡晥D 時(shí),一般不會(huì)輕易通過(guò)視圖對(duì)底層數(shù)據(jù)進(jìn)行修改. 而且可以可以通過(guò)權(quán)限限制, 已得到更高的安全性.
官方定義:
視圖(view)是一種虛擬存在的表,是一個(gè)邏輯表(不涉及實(shí)際的存儲(chǔ)),本身并不包含數(shù)據(jù)。其內(nèi)容由查詢(xún)定義。
基表:用來(lái)創(chuàng)建視圖的表叫做基表;
通過(guò)視圖,可以展現(xiàn)基表的部分?jǐn)?shù)據(jù);
視圖數(shù)據(jù)來(lái)自定義視圖的查詢(xún)中使用的表,使用視圖動(dòng)態(tài)生成;

注意: 視圖的修改可以映射到基表, 也就是說(shuō), 視圖可以做到修改基表.
這個(gè)很多時(shí)候容易想不明白. 視圖只是一張?zhí)摂M表, 通過(guò)基表生成, 為什么我們還允許這張?zhí)摂M表數(shù)據(jù)的更改足以映射到基表?
針對(duì)單表映射而成的視圖而言, 視圖的修改可以映射到基表.
同樣, 基表數(shù)據(jù)的更改也會(huì)影響到視圖. 畢竟對(duì)視圖的各種操作也是映射到基表上面去的
其一,視圖并不保存數(shù)據(jù), 如果視圖修改的數(shù)據(jù)并不能映射到基表, 那么修改的這個(gè)數(shù)據(jù)就無(wú)法存儲(chǔ)下來(lái).
其二,個(gè)人一個(gè)理解, 視圖有些時(shí)候是更高層級(jí)的人維護(hù), 創(chuàng)建出來(lái)給開(kāi)發(fā)人員使用的, 開(kāi)發(fā)人員的操作應(yīng)該需要能映射到基表中. 為啥開(kāi)發(fā)人員都只是看視圖,而不是原表? 有些數(shù)據(jù)可能需要保密. 開(kāi)發(fā)人員也只能查看部分.
測(cè)試: 視圖和基表是否可以相互影響.
視圖的修改可以映射到基表, 驗(yàn)證如下.

驗(yàn)證基表的修改是否會(huì)映射到視圖 (也會(huì))

如何創(chuàng)建視圖?
create view view_name as (select 語(yǔ)句)
select語(yǔ)句可以是嵌套查詢(xún), 也可以是聯(lián)表查詢(xún)
創(chuàng)建之后相當(dāng)于是如下:

刪除視圖
drop view view_name;
查看視圖。 沒(méi)有單獨(dú)查看視圖的命令, 直接查看表就會(huì)看到視圖. 所以對(duì)于視圖我們的命名還是可以給與區(qū)分一下

視圖的用途?
可復(fù)用,減少重復(fù)語(yǔ)句書(shū)寫(xiě);類(lèi)似程序中函數(shù)的作用。 比如聯(lián)表查詢(xún)語(yǔ)句. 組合成視圖之后,簡(jiǎn)化了不要太多.

邏輯更清晰,屏蔽查詢(xún)細(xì)節(jié),關(guān)注數(shù)據(jù)返回;
注意點(diǎn)
視圖不能添加索引,也不能有關(guān)聯(lián)的觸發(fā)器或者默認(rèn)值
抓住視圖并沒(méi)有存儲(chǔ)數(shù)據(jù), 對(duì)視圖的操作就是映射到對(duì)基表的操作, 視圖可以簡(jiǎn)單理解為基表的一個(gè)簡(jiǎn)化對(duì)外顯示。視圖操作映射到基表, 基表操作也同樣會(huì)影響視圖. (關(guān)鍵就在于視圖沒(méi)有單獨(dú)存儲(chǔ)數(shù)據(jù))
還有另外一種視圖, 叫做物化視圖, 這種視圖和普通視圖不太一樣的是. 物化視圖是存儲(chǔ)數(shù)據(jù)的, 而且物化視圖數(shù)據(jù)的訪(fǎng)問(wèn)不是從基表, 而是直接從物化視圖中讀取數(shù)據(jù)的
物化視圖(Materialized Views,以下簡(jiǎn)稱(chēng) MV)是一種特殊的視圖,它的數(shù)據(jù)會(huì)持久化。那么在查詢(xún) MV 時(shí),并不會(huì)去訪(fǎng)問(wèn)基表,而是直接從 MV 里讀數(shù)據(jù)。(可做了解)
觸發(fā)器
什么是觸發(fā)器?
個(gè)人理解: 觸發(fā)器就是一個(gè)條件觸發(fā), 事件觸發(fā). 和自動(dòng)機(jī), 狀態(tài)機(jī)有點(diǎn)相似.
有限自動(dòng)機(jī): 提前制定好條件, 以及條件滿(mǎn)足時(shí)候的執(zhí)行操作. 后面滿(mǎn)足條件就會(huì)循環(huán)不斷的自動(dòng)執(zhí)行相應(yīng)的操作. 這個(gè)就是自動(dòng)機(jī)了. (其實(shí)本質(zhì)也是一種條件觸發(fā)) 同樣觸發(fā)器也是. 就像是回調(diào)機(jī)制, 同步操作.
觸發(fā)器就是指定在特定的sql DML操作發(fā)生之時(shí)在操作之前或者之后的瞬間接近同步的執(zhí)行觸發(fā)器指定的觸發(fā)操作.
官方定義:9
觸發(fā)器(trigger)是MySQL提供給程序員和數(shù)據(jù)分析員來(lái)保證數(shù)據(jù)完整性的一種方法,它是與表 事件相關(guān)的特殊的存儲(chǔ)過(guò)程,它的執(zhí)行不是由程序調(diào)用,也不是手工啟動(dòng),而是由事件來(lái)觸發(fā),比 如當(dāng)對(duì)一個(gè)表進(jìn)行DML操作( insert , delete , update )時(shí)就會(huì)激活它執(zhí)行。
觸發(fā)器關(guān)注要素:
- 監(jiān)控的對(duì)象: table表
- 監(jiān)控的事件類(lèi)型: insert update delete
- 觸發(fā)時(shí)機(jī):before after
- 指定觸發(fā)事件: insert update delete
怎么創(chuàng)建觸發(fā)器?
create trigger trigger_name
trigger_time monitor_trigger_event -- 觸發(fā)時(shí)機(jī), 監(jiān)控事件
on table_name for each row -- 監(jiān)控表
begin
trigger_body; -- 正文, 觸發(fā)事件
endNEW && OLD (數(shù)據(jù)插入后的新表 刪除后的舊表, 更新前后的新舊表)
- insert類(lèi)型觸發(fā)器中: New 用來(lái)表達(dá)即將(before)或者已經(jīng)(after)插入的新數(shù)據(jù);
- delete類(lèi)型觸發(fā)器中:Old用來(lái)表達(dá)將要或者已經(jīng)刪除的舊的數(shù)據(jù).
- update類(lèi)型觸發(fā)器中: old表示原來(lái)的舊的數(shù)據(jù), new表示新的更新的數(shù)據(jù)
用法:
new.colname (新的數(shù)據(jù)的某一字段)
old.colname (舊的原來(lái)的數(shù)據(jù)的某一字段)
觸發(fā)器用途 (應(yīng)用場(chǎng)景)?
先準(zhǔn)備兩個(gè)表: 訂單表和貨物表
CREATE TABLE `order` ( `id` INT PRIMARY KEY auto_increment, -- 主鍵字段 `goods_id` INT, -- 貨物id, 外鍵字段 `quantity` SMALLINT COMMENT '下單數(shù)量' -- 下單數(shù)量 ); CREATE TABLE `goods` ( `id` INT PRIMARY KEY auto_increment, -- goods_id 貨物主鍵字段 `name` VARCHAR (32), -- 貨物名稱(chēng) `num` SMALLINT DEFAULT 0 -- 貨物數(shù)量 );
要求1:
每當(dāng)客戶(hù)購(gòu)買(mǎi), 下單的時(shí)候,就自動(dòng)跟新一下貨物庫(kù)存. (客戶(hù)下單, 觸發(fā)貨物庫(kù)存更新操作)
-- 創(chuàng)建觸發(fā)器
create trigger trig_order_4 -- 觸發(fā)器名稱(chēng)
after insert -- 觸發(fā)器時(shí)機(jī), 監(jiān)控觸發(fā)事件
on `order` for each row
begin
update goods set num = num - new.quantity where id = new.goods_id;
-- 觸發(fā)正文, 觸發(fā)事件
endTest: 測(cè)試 (id=1自動(dòng)減少了2,這個(gè)是我之前創(chuàng)建的觸發(fā)器還沒(méi)有刪除, 不是出錯(cuò)了)

反正就是, 如果是插入,可以通過(guò)插入的數(shù)據(jù)new表進(jìn)行限定. 如果是刪除操作可以用old表對(duì)刪除數(shù)據(jù)進(jìn)行指定, 如果是update操作, 可以用old對(duì)更新之前的數(shù)據(jù)指定和new更新之后的數(shù)據(jù)進(jìn)行限定.
正好引入刪除觸發(fā)器 drop trigger trigger_name 刪除;

觸發(fā)器是否具有事務(wù)性?
到此這篇關(guān)于Mysql視圖和觸發(fā)器使用過(guò)程的文章就介紹到這了,更多相關(guān)MySql視圖觸發(fā)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL 數(shù)據(jù)庫(kù)設(shè)計(jì)復(fù)習(xí)筆記及項(xiàng)目實(shí)戰(zhàn)
參考的數(shù)據(jù)庫(kù)文檔主要有:目前國(guó)內(nèi)的常見(jiàn)的PHP系統(tǒng)的數(shù)據(jù)庫(kù)2010-03-03
mysql分頁(yè)時(shí)offset過(guò)大的Sql優(yōu)化經(jīng)驗(yàn)分享
MySQL select count(*)計(jì)數(shù)很慢優(yōu)化方案
MySQL數(shù)據(jù)庫(kù)索引以及失效場(chǎng)景詳解

