Mysql視圖和觸發(fā)器使用過程
視圖
視圖是什么, 是否真實存在?
個人理解:視圖視圖,只是你可以看見的一層抽象層, 它并不真實存在, 而是在真實存在的一張或者多張表之上的一層封裝, 對于select查詢語句的提前封裝. 不涉及數(shù)據(jù)的存儲.
這樣的一層封裝好處是蠻多的. 對于復雜查詢操作語句的簡化 --- 方便后序使用.
安全性,我們在使用視圖 時,一般不會輕易通過視圖對底層數(shù)據(jù)進行修改. 而且可以可以通過權限限制, 已得到更高的安全性.
官方定義:
視圖(view)是一種虛擬存在的表,是一個邏輯表(不涉及實際的存儲),本身并不包含數(shù)據(jù)。其內(nèi)容由查詢定義。
基表:用來創(chuàng)建視圖的表叫做基表;
通過視圖,可以展現(xiàn)基表的部分數(shù)據(jù);
視圖數(shù)據(jù)來自定義視圖的查詢中使用的表,使用視圖動態(tài)生成;
注意: 視圖的修改可以映射到基表, 也就是說, 視圖可以做到修改基表.
這個很多時候容易想不明白. 視圖只是一張?zhí)摂M表, 通過基表生成, 為什么我們還允許這張?zhí)摂M表數(shù)據(jù)的更改足以映射到基表?
針對單表映射而成的視圖而言, 視圖的修改可以映射到基表.
同樣, 基表數(shù)據(jù)的更改也會影響到視圖. 畢竟對視圖的各種操作也是映射到基表上面去的
其一,視圖并不保存數(shù)據(jù), 如果視圖修改的數(shù)據(jù)并不能映射到基表, 那么修改的這個數(shù)據(jù)就無法存儲下來.
其二,個人一個理解, 視圖有些時候是更高層級的人維護, 創(chuàng)建出來給開發(fā)人員使用的, 開發(fā)人員的操作應該需要能映射到基表中. 為啥開發(fā)人員都只是看視圖,而不是原表? 有些數(shù)據(jù)可能需要保密. 開發(fā)人員也只能查看部分.
測試: 視圖和基表是否可以相互影響.
視圖的修改可以映射到基表, 驗證如下.
驗證基表的修改是否會映射到視圖 (也會)
如何創(chuàng)建視圖?
create view view_name as (select 語句)
select語句可以是嵌套查詢, 也可以是聯(lián)表查詢
創(chuàng)建之后相當于是如下:
刪除視圖
drop view view_name;
查看視圖。 沒有單獨查看視圖的命令, 直接查看表就會看到視圖. 所以對于視圖我們的命名還是可以給與區(qū)分一下
視圖的用途?
可復用,減少重復語句書寫;類似程序中函數(shù)的作用。 比如聯(lián)表查詢語句. 組合成視圖之后,簡化了不要太多.
邏輯更清晰,屏蔽查詢細節(jié),關注數(shù)據(jù)返回;
注意點
視圖不能添加索引,也不能有關聯(lián)的觸發(fā)器或者默認值
抓住視圖并沒有存儲數(shù)據(jù), 對視圖的操作就是映射到對基表的操作, 視圖可以簡單理解為基表的一個簡化對外顯示。視圖操作映射到基表, 基表操作也同樣會影響視圖. (關鍵就在于視圖沒有單獨存儲數(shù)據(jù))
還有另外一種視圖, 叫做物化視圖, 這種視圖和普通視圖不太一樣的是. 物化視圖是存儲數(shù)據(jù)的, 而且物化視圖數(shù)據(jù)的訪問不是從基表, 而是直接從物化視圖中讀取數(shù)據(jù)的
物化視圖(Materialized Views,以下簡稱 MV)是一種特殊的視圖,它的數(shù)據(jù)會持久化。那么在查詢 MV 時,并不會去訪問基表,而是直接從 MV 里讀數(shù)據(jù)。(可做了解)
觸發(fā)器
什么是觸發(fā)器?
個人理解: 觸發(fā)器就是一個條件觸發(fā), 事件觸發(fā). 和自動機, 狀態(tài)機有點相似.
有限自動機: 提前制定好條件, 以及條件滿足時候的執(zhí)行操作. 后面滿足條件就會循環(huán)不斷的自動執(zhí)行相應的操作. 這個就是自動機了. (其實本質(zhì)也是一種條件觸發(fā)) 同樣觸發(fā)器也是. 就像是回調(diào)機制, 同步操作.
觸發(fā)器就是指定在特定的sql DML操作發(fā)生之時在操作之前或者之后的瞬間接近同步的執(zhí)行觸發(fā)器指定的觸發(fā)操作.
官方定義:9
觸發(fā)器(trigger)是MySQL提供給程序員和數(shù)據(jù)分析員來保證數(shù)據(jù)完整性的一種方法,它是與表 事件相關的特殊的存儲過程,它的執(zhí)行不是由程序調(diào)用,也不是手工啟動,而是由事件來觸發(fā),比 如當對一個表進行DML操作( insert , delete , update )時就會激活它執(zhí)行。
觸發(fā)器關注要素:
- 監(jiān)控的對象: table表
- 監(jiān)控的事件類型: insert update delete
- 觸發(fā)時機:before after
- 指定觸發(fā)事件: insert update delete
怎么創(chuàng)建觸發(fā)器?
create trigger trigger_name trigger_time monitor_trigger_event -- 觸發(fā)時機, 監(jiān)控事件 on table_name for each row -- 監(jiān)控表 begin trigger_body; -- 正文, 觸發(fā)事件 end
NEW && OLD (數(shù)據(jù)插入后的新表 刪除后的舊表, 更新前后的新舊表)
- insert類型觸發(fā)器中: New 用來表達即將(before)或者已經(jīng)(after)插入的新數(shù)據(jù);
- delete類型觸發(fā)器中:Old用來表達將要或者已經(jīng)刪除的舊的數(shù)據(jù).
- update類型觸發(fā)器中: old表示原來的舊的數(shù)據(jù), new表示新的更新的數(shù)據(jù)
用法:
new.colname (新的數(shù)據(jù)的某一字段)
old.colname (舊的原來的數(shù)據(jù)的某一字段)
觸發(fā)器用途 (應用場景)?
先準備兩個表: 訂單表和貨物表
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:
每當客戶購買, 下單的時候,就自動跟新一下貨物庫存. (客戶下單, 觸發(fā)貨物庫存更新操作)
-- 創(chuàng)建觸發(fā)器 create trigger trig_order_4 -- 觸發(fā)器名稱 after insert -- 觸發(fā)器時機, 監(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: 測試 (id=1自動減少了2,這個是我之前創(chuàng)建的觸發(fā)器還沒有刪除, 不是出錯了)
反正就是, 如果是插入,可以通過插入的數(shù)據(jù)new表進行限定. 如果是刪除操作可以用old表對刪除數(shù)據(jù)進行指定, 如果是update操作, 可以用old對更新之前的數(shù)據(jù)指定和new更新之后的數(shù)據(jù)進行限定.
正好引入刪除觸發(fā)器 drop trigger trigger_name 刪除;
觸發(fā)器是否具有事務性?
到此這篇關于Mysql視圖和觸發(fā)器使用過程的文章就介紹到這了,更多相關MySql視圖觸發(fā)器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Mysql插入帶有引號的字符串數(shù)據(jù)最佳實踐
在MySQL中可以使用單引號或雙引號來包裹字符串,下面這篇文章主要給大家介紹了關于Mysql插入帶有引號的字符串數(shù)據(jù)的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-01-01MySQL 5.7.18 release版安裝指南(含有bin文件版本)
這篇文章主要介紹了MySQL 5.7.18 release版安裝指南,本文只談論release版,即含有bin文件版本,需要的朋友可以參考下2017-04-04MySQL千萬級數(shù)據(jù)的大表優(yōu)化解決方案
mysql數(shù)據(jù)庫中的表數(shù)據(jù)量幾千萬后,查詢速度會很慢,日常各種卡慢,嚴重影響使用體驗。在考慮升級數(shù)據(jù)庫或者換用大數(shù)據(jù)解決方案前,必須優(yōu)化現(xiàn)有mysql數(shù)據(jù)庫表設計和sql語句。2022-11-11虛擬機linux端mysql數(shù)據(jù)庫無法遠程訪問的解決辦法
最近在項目搭建過程中遇到一問題,有關虛擬機linux端mysql數(shù)據(jù)庫無法遠程訪問,通過查閱相關數(shù)據(jù)庫資料問題解決,下面把具體的解決辦法分享給大家,有需要的朋友可以參考下2015-08-08mysql實現(xiàn)合并同一ID對應多條數(shù)據(jù)的方法
這篇文章主要介紹了mysql實現(xiàn)合并同一ID對應多條數(shù)據(jù)的方法,涉及mysql GROUP_CONCAT函數(shù)的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下2016-06-06mysql 5.7.18 安裝配置方法圖文教程(CentOS7)
這篇文章主要為大家詳細介紹了CentOS 7下mysql 5.7.18 安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04