Mysql視圖和觸發(fā)器使用過程
視圖
視圖是什么, 是否真實(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)文章
Mysql插入帶有引號(hào)的字符串?dāng)?shù)據(jù)最佳實(shí)踐
在MySQL中可以使用單引號(hào)或雙引號(hào)來包裹字符串,下面這篇文章主要給大家介紹了關(guān)于Mysql插入帶有引號(hào)的字符串?dāng)?shù)據(jù)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01MySQL 5.7.18 release版安裝指南(含有bin文件版本)
這篇文章主要介紹了MySQL 5.7.18 release版安裝指南,本文只談?wù)搑elease版,即含有bin文件版本,需要的朋友可以參考下2017-04-04MySQL千萬級(jí)數(shù)據(jù)的大表優(yōu)化解決方案
mysql數(shù)據(jù)庫(kù)中的表數(shù)據(jù)量幾千萬后,查詢速度會(huì)很慢,日常各種卡慢,嚴(yán)重影響使用體驗(yàn)。在考慮升級(jí)數(shù)據(jù)庫(kù)或者換用大數(shù)據(jù)解決方案前,必須優(yōu)化現(xiàn)有mysql數(shù)據(jù)庫(kù)表設(shè)計(jì)和sql語句。2022-11-11虛擬機(jī)linux端mysql數(shù)據(jù)庫(kù)無法遠(yuǎn)程訪問的解決辦法
最近在項(xiàng)目搭建過程中遇到一問題,有關(guān)虛擬機(jī)linux端mysql數(shù)據(jù)庫(kù)無法遠(yuǎn)程訪問,通過查閱相關(guān)數(shù)據(jù)庫(kù)資料問題解決,下面把具體的解決辦法分享給大家,有需要的朋友可以參考下2015-08-08mysql實(shí)現(xiàn)合并同一ID對(duì)應(yīng)多條數(shù)據(jù)的方法
這篇文章主要介紹了mysql實(shí)現(xiàn)合并同一ID對(duì)應(yīng)多條數(shù)據(jù)的方法,涉及mysql GROUP_CONCAT函數(shù)的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06利用JuiceFS使MySQL?備份驗(yàn)證性能提升?10?倍
這篇文章主要介紹了如何讓?MySQL?備份驗(yàn)證性能提升?10?倍,JuiceFS?非常適合用來做?MySQL?物理備份,通過不斷調(diào)整?XtraBackup?的參數(shù)和?JuiceFS?的掛載參數(shù),在一個(gè)小時(shí)內(nèi)將時(shí)間縮短到原先的?1/10,下文一起來看相關(guān)內(nèi)容的詳細(xì)介紹吧2022-03-03mysql 5.7.18 安裝配置方法圖文教程(CentOS7)
這篇文章主要為大家詳細(xì)介紹了CentOS 7下mysql 5.7.18 安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04