首頁 > 軟體

Mysql檢視和觸發器使用過程

2022-12-09 14:04:06

檢視

檢視是什麼, 是否真實存在?

個人理解:檢視檢視,只是你可以看見的一層抽象層, 它並不真實存在, 而是在真實存在的一張或者多張表之上的一層封裝, 對於select查詢語句的提前封裝. 不涉及資料的儲存.

這樣的一層封裝好處是蠻多的. 對於複雜查詢操作語句的簡化 --- 方便後序使用.

安全性,我們在使用檢視 時,一般不會輕易通過檢視對底層資料進行修改. 而且可以可以通過許可權限制, 已得到更高的安全性.

官方定義:

檢視(view)是一種虛擬存在的表,是一個邏輯表(不涉及實際的儲存),本身並不包含資料。其內容由查詢定義。

基表:用來建立檢視的表叫做基表;

通過檢視,可以展現基表的部分資料;

檢視資料來自定義檢視的查詢中使用的表,使用檢視動態生成;

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

這個很多時候容易想不明白. 檢視只是一張虛擬表, 通過基表生成, 為什麼我們還允許這張虛擬表資料的更改足以對映到基表?

針對單表對映而成的檢視而言, 檢視的修改可以對映到基表.

同樣, 基表資料的更改也會影響到檢視. 畢竟對檢視的各種操作也是對映到基表上面去的

其一,檢視並不儲存資料, 如果檢視修改的資料並不能對映到基表, 那麼修改的這個資料就無法儲存下來.

其二,個人一個理解, 檢視有些時候是更高層級的人維護, 建立出來給開發人員使用的, 開發人員的操作應該需要能對映到基表中. 為啥開發人員都只是看檢視,而不是原表? 有些資料可能需要保密. 開發人員也只能檢視部分.

測試: 檢視和基表是否可以相互影響.

檢視的修改可以對映到基表, 驗證如下.

驗證基表的修改是否會對映到檢視 (也會)

如何建立檢視?

create view view_name as (select 語句)

select語句可以是巢狀查詢, 也可以是聯表查詢

建立之後相當於是如下:

刪除檢視

drop view view_name;

檢視檢視。 沒有單獨檢視檢視的命令, 直接檢視表就會看到檢視. 所以對於檢視我們的命名還是可以給與區分一下

檢視的用途?

可複用,減少重複語句書寫;類似程式中函數的作用。 比如聯表查詢語句. 組合成檢視之後,簡化了不要太多.

邏輯更清晰,遮蔽查詢細節,關注資料返回;

注意點

檢視不能新增索引,也不能有關聯的觸發器或者預設值

抓住檢視並沒有儲存資料, 對檢視的操作就是對映到對基表的操作, 檢視可以簡單理解為基表的一個簡化對外顯示。檢視操作對映到基表, 基表操作也同樣會影響檢視. (關鍵就在於檢視沒有單獨儲存資料)

還有另外一種檢視, 叫做物化檢視, 這種檢視和普通檢視不太一樣的是. 物化檢視是儲存資料的, 而且物化檢視資料的存取不是從基表, 而是直接從物化檢視中讀取資料的

物化檢視(Materialized Views,以下簡稱 MV)是一種特殊的檢視,它的資料會持久化。那麼在查詢 MV 時,並不會去存取基表,而是直接從 MV 裡讀資料。(可做了解)

觸發器

什麼是觸發器?

個人理解: 觸發器就是一個條件觸發, 事件觸發. 和自動機, 狀態機有點相似.

有限自動機: 提前制定好條件, 以及條件滿足時候的執行操作. 後面滿足條件就會迴圈不斷的自動執行相應的操作. 這個就是自動機了. (其實本質也是一種條件觸發) 同樣觸發器也是. 就像是回撥機制, 同步操作.

觸發器就是指定在特定的sql DML操作發生之時在操作之前或者之後的瞬間接近同步的執行觸發器指定的觸發操作.

官方定義:9

觸發器(trigger)是MySQL提供給程式設計師和資料分析員來保證資料完整性的一種方法,它是與表 事件相關的特殊的儲存過程,它的執行不是由程式呼叫,也不是手工啟動,而是由事件來觸發,比 如當對一個表進行DML操作( insert , delete , update )時就會啟用它執行。

觸發器關注要素:

  • 監控的物件: table表
  • 監控的事件型別: insert update delete
  • 觸發時機:before after
  • 指定觸發事件: insert update delete

怎麼建立觸發器?

create trigger trigger_name                
trigger_time monitor_trigger_event        -- 觸發時機, 監控事件
on table_name for each row                -- 監控表
begin
     trigger_body;                        -- 正文, 觸發事件
end

NEW && OLD (資料插入後的新表 刪除後的舊錶, 更新前後的新舊錶)

  • insert型別觸發器中: New 用來表達即將(before)或者已經(after)插入的新資料;
  • delete型別觸發器中:Old用來表達將要或者已經刪除的舊的資料.
  • update型別觸發器中: old表示原來的舊的資料, new表示新的更新的資料

用法:

new.colname (新的資料的某一欄位)

old.colname (舊的原來的資料的某一欄位)

觸發器用途 (應用場景)?

先準備兩個表: 訂單表和貨物表

CREATE TABLE `order` (
	`id` INT PRIMARY KEY auto_increment,    -- 主鍵欄位
	`goods_id` INT,                         -- 貨物id, 外來鍵欄位
	`quantity` SMALLINT COMMENT '下單數量'   -- 下單數量
);
CREATE TABLE `goods` (
	`id` INT PRIMARY KEY auto_increment,   -- goods_id 貨物主鍵欄位
	`name` VARCHAR (32),                   -- 貨物名稱
	`num` SMALLINT DEFAULT 0               -- 貨物數量
);

要求1:

每當客戶購買, 下單的時候,就自動跟新一下貨物庫存. (客戶下單, 觸發貨物庫存更新操作)

-- 建立觸發器
create trigger trig_order_4 -- 觸發器名稱 
after insert -- 觸發器時機, 監控觸發事件
on `order` for each row
begin
	update goods set num = num - new.quantity where id = new.goods_id; 
    -- 觸發正文, 觸發事件
end

Test: 測試 (id=1自動減少了2,這個是我之前建立的觸發器還沒有刪除, 不是出錯了)

反正就是, 如果是插入,可以通過插入的資料new表進行限定. 如果是刪除操作可以用old表對刪除資料進行指定, 如果是update操作, 可以用old對更新之前的資料指定和new更新之後的資料進行限定.

正好引入刪除觸發器 drop trigger trigger_name 刪除;

觸發器是否具有事務性?

到此這篇關於Mysql檢視和觸發器使用過程的文章就介紹到這了,更多相關MySql檢視觸發器內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com