欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Mysql視圖和觸發(fā)器使用過程

 更新時(shí)間:2022年12月07日 09:43:57   作者:小杰312  
這篇文章主要介紹了MySql視圖與觸發(fā)器使用過程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

視圖

視圖是什么, 是否真實(shí)存在?

個(gè)人理解:視圖視圖,只是你可以看見的一層抽象層, 它并不真實(shí)存在, 而是在真實(shí)存在的一張或者多張表之上的一層封裝, 對(duì)于select查詢語句的提前封裝. 不涉及數(shù)據(jù)的存儲(chǔ).

這樣的一層封裝好處是蠻多的. 對(duì)于復(fù)雜查詢操作語句的簡(jiǎn)化 --- 方便后序使用.

安全性,我們?cè)谑褂靡晥D 時(shí),一般不會(huì)輕易通過視圖對(duì)底層數(shù)據(jù)進(jìn)行修改. 而且可以可以通過權(quán)限限制, 已得到更高的安全性.

官方定義:

視圖(view)是一種虛擬存在的表,是一個(gè)邏輯表(不涉及實(shí)際的存儲(chǔ)),本身并不包含數(shù)據(jù)。其內(nèi)容由查詢定義。

基表:用來創(chuàng)建視圖的表叫做基表;

通過視圖,可以展現(xiàn)基表的部分?jǐn)?shù)據(jù);

視圖數(shù)據(jù)來自定義視圖的查詢中使用的表,使用視圖動(dòng)態(tài)生成;

注意: 視圖的修改可以映射到基表, 也就是說, 視圖可以做到修改基表.

這個(gè)很多時(shí)候容易想不明白. 視圖只是一張?zhí)摂M表, 通過基表生成, 為什么我們還允許這張?zhí)摂M表數(shù)據(jù)的更改足以映射到基表?

針對(duì)單表映射而成的視圖而言, 視圖的修改可以映射到基表.

同樣, 基表數(shù)據(jù)的更改也會(huì)影響到視圖. 畢竟對(duì)視圖的各種操作也是映射到基表上面去的

其一,視圖并不保存數(shù)據(jù), 如果視圖修改的數(shù)據(jù)并不能映射到基表, 那么修改的這個(gè)數(shù)據(jù)就無法存儲(chǔ)下來.

其二,個(gè)人一個(gè)理解, 視圖有些時(shí)候是更高層級(jí)的人維護(hù), 創(chuàng)建出來給開發(fā)人員使用的, 開發(fā)人員的操作應(yīng)該需要能映射到基表中. 為啥開發(fā)人員都只是看視圖,而不是原表? 有些數(shù)據(jù)可能需要保密. 開發(fā)人員也只能查看部分.

測(cè)試: 視圖和基表是否可以相互影響.

視圖的修改可以映射到基表, 驗(yàn)證如下.

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

如何創(chuàng)建視圖?

create view view_name as (select 語句)

select語句可以是嵌套查詢, 也可以是聯(lián)表查詢

創(chuàng)建之后相當(dāng)于是如下:

刪除視圖

drop view view_name;

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

視圖的用途?

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

邏輯更清晰,屏蔽查詢細(xì)節(jié),關(guān)注數(shù)據(jù)返回;

注意點(diǎn)

視圖不能添加索引,也不能有關(guān)聯(lián)的觸發(fā)器或者默認(rèn)值

抓住視圖并沒有存儲(chǔ)數(shù)據(jù), 對(duì)視圖的操作就是映射到對(duì)基表的操作, 視圖可以簡(jiǎn)單理解為基表的一個(gè)簡(jiǎn)化對(duì)外顯示。視圖操作映射到基表, 基表操作也同樣會(huì)影響視圖. (關(guān)鍵就在于視圖沒有單獨(dú)存儲(chǔ)數(shù)據(jù))

還有另外一種視圖, 叫做物化視圖, 這種視圖和普通視圖不太一樣的是. 物化視圖是存儲(chǔ)數(shù)據(jù)的, 而且物化視圖數(shù)據(jù)的訪問不是從基表, 而是直接從物化視圖中讀取數(shù)據(jù)的

物化視圖(Materialized Views,以下簡(jiǎn)稱 MV)是一種特殊的視圖,它的數(shù)據(jù)會(huì)持久化。那么在查詢 MV 時(shí),并不會(huì)去訪問基表,而是直接從 MV 里讀數(shù)據(jù)。(可做了解)

觸發(fā)器

什么是觸發(fā)器?

個(gè)人理解: 觸發(fā)器就是一個(gè)條件觸發(fā), 事件觸發(fā). 和自動(dòng)機(jī), 狀態(tài)機(jī)有點(diǎn)相似.

有限自動(dòng)機(jī): 提前制定好條件, 以及條件滿足時(shí)候的執(zhí)行操作. 后面滿足條件就會(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ù)分析員來保證數(shù)據(jù)完整性的一種方法,它是與表 事件相關(guān)的特殊的存儲(chǔ)過程,它的執(zhí)行不是由程序調(diào)用,也不是手工啟動(dòng),而是由事件來觸發(fā),比 如當(dāng)對(duì)一個(gè)表進(jìn)行DML操作( insert , delete , update )時(shí)就會(huì)激活它執(zhí)行。

觸發(fā)器關(guān)注要素:

  • 監(jiān)控的對(duì)象: table表
  • 監(jiān)控的事件類型: 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ā)事件
end

NEW && OLD (數(shù)據(jù)插入后的新表 刪除后的舊表, 更新前后的新舊表)

  • insert類型觸發(fā)器中: New 用來表達(dá)即將(before)或者已經(jīng)(after)插入的新數(shù)據(jù);
  • delete類型觸發(fā)器中:Old用來表達(dá)將要或者已經(jīng)刪除的舊的數(shù)據(jù).
  • update類型觸發(fā)器中: old表示原來的舊的數(shù)據(jù), new表示新的更新的數(shù)據(jù)

用法:

new.colname (新的數(shù)據(jù)的某一字段)

old.colname (舊的原來的數(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),                   -- 貨物名稱
	`num` SMALLINT DEFAULT 0               -- 貨物數(shù)量
);

要求1:

每當(dāng)客戶購(gòu)買, 下單的時(shí)候,就自動(dòng)跟新一下貨物庫(kù)存. (客戶下單, 觸發(fā)貨物庫(kù)存更新操作)

-- 創(chuàng)建觸發(fā)器
create trigger trig_order_4 -- 觸發(fā)器名稱 
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ā)事件
end

Test: 測(cè)試 (id=1自動(dòng)減少了2,這個(gè)是我之前創(chuàng)建的觸發(fā)器還沒有刪除, 不是出錯(cuò)了)

反正就是, 如果是插入,可以通過插入的數(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ān)MySql視圖觸發(fā)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論