mySQL教程 第9章 觸發器

第9章 觸發器

入的新數據放到new表,刪除的數據放到old表。

準備本章學習環境

連接數據庫schoolDB,刪除表TStudent,TScore和Tsubject中的所有數據。

delete from TStudent;

delete from TScore;

delete from TSubject;

向學生表插入兩條記錄

insert TStudent (StudentID,Sname,sex,Class)

values ('00001','張作霖','男','JAVA'),

('00002','湯二虎','男','NET')

向課程表插入3條記錄

insert into TSubject values

('0001','計算機網絡','奠基計算機網絡','清華出版社'),

('0002','數據結構','大話數據結構','人郵出版社'),

('0003','JAVA開發','JAVA企業級開發','人郵出版社')

clip_image001

創建插入觸發器

1. 練習:創建插入觸發器

查看表TStudent中的記錄,你發現沒有錄入時間enterTime,也沒有郵箱Email。

select * from TStudent

clip_image002

下面創建觸發器,在TStudent表中插入記錄時,使用觸發器插入錄入時間即enterTime和郵箱即Email。

創建觸發器

CREATE TRIGGER autoTimeAndEmail

BEFORE INSERT on `TStudent`

FOR EACH ROW

BEGIN

SET NEW.enterTime=NOW();

SET NEW.Email=concat(PINYIN(NEW.sname),'@hotmail.com');

END

插入兩條記錄測試觸發器是否工作。

insert TStudent (StudentID,Sname,sex,Class)

values ('00003','張左相','男','JAVA'),

('00004','張四非','男','NET')

clip_image003

查看新插入的記錄,發現已經由觸發器插入了用戶郵箱和錄入時間

select * from TStudent

clip_image004

2. 練習:使用觸發器實現數據插入跟蹤

使用觸發器實現對TStudent表數據插入的跟蹤,將跟蹤事件記錄到一張審計表中review。

一張表不能同時有多個插入觸發器

Drop TRIGGER autoTimeAndEmail

創建記錄跟蹤的審計表

create table review

(

username varchar(20),

act VARCHAR(10),

studentID varchar(10),

sname VARCHAR(10),

actTime TIMESTAMP

)

創建觸發器,該觸發器向insertReview表中記錄

CREATE TRIGGER insertReview BEFORE INSERT on `TStudent`

FOR EACH ROW

BEGIN

insert review values (user(),'insert',NEW.studentID,NEW.sname,NOW());

END

在Tstudent表插入一條記錄

INSERT `TStudent` (studentid,sname,sex,class) VALUES ('00005','王嚴明','男','NET')

查看review表是否記錄了

select * from review

可以看到已經記錄下那個用戶什么時間插入了一條記錄

clip_image005

3. 練習:創建update觸發器

在TStudent表上創建觸發器,在review表中記錄更改學生的學號和更改前的姓名。

CREATE TRIGGER updateReview BEFORE UPDATE on `TStudent`

FOR EACH ROW

BEGIN

insert review values (user(),'update',NEW.studentID,old.sname,NOW());

END

查看學號是00005的學生姓名

select * from `TStudent` where studentID='00005'

clip_image006

UPDATE `TStudent` SET sname='馮國彰' where studentID='00005'

查看是否記錄

select * from `review`

clip_image007

4. 練習:創建刪除觸發器

該觸發器能夠記錄TStudent表的刪除事件到review表

CREATE TRIGGER deleteReview BEFORE DELETE on `TStudent`

FOR EACH ROW

BEGIN

insert review values (user(),'delete',old.studentID,old.sname,NOW());

END

刪除二條記錄

delete from `TStudent` where studentID='00002'

select * from review

clip_image008

5. 練習:在觸發器中使用異常回滾操作

MySQL的觸發器中不支持rollback和 commit,也就是說如果出現異常,沒有辦法回滾。解決辦法是,如果打算回滾更改,人為產生異常。

創建觸發器,限定TStudent表sex列只能輸入‘男’或‘女’。如果是其他值,取消插入操作。

注意紅色部分是故意產生的錯誤,因為沒有定義E001,這樣會自動取消插入。

CREATE TRIGGER limitSex BEFORE INSERT on `TStudent`

FOR EACH ROW

BEGIN

declare M_ERRMSG varchar(10);

if NEW.sex='男' or NEW.sex='女' then

set M_ERRMSG='插入成功';

else select E001 INTO M_ERRMSG;

end if;

END

插入記錄,其中一條性別是錯誤的

insert TStudent (StudentID,Sname,sex,Class)

values ('00005','馮國章','男','JAVA'),

('00006','牛萬鵬','南','NET')

可以看到插入失敗

clip_image009

查看是否插入了兩條,可以看到一條也沒插入成功。

clip_image010

直插入一條正確的

insert TStudent (StudentID,Sname,sex,Class) values ('00005','馮國章','男','JAVA')

可以看到插入成功

clip_image011

6. 練習:查看創建的觸發器

雙擊表,在Triggers標簽下,可以看到表上的觸發器

clip_image012

在以下圖中也可以看到創建的觸發器

clip_image013

7. 練習:查看觸發器的定義

clip_image014

8. 練習:使用SHOW TRIGGERS顯示觸發器;

SHOW TRIGGERS;

clip_image015

clip_image016

9. 練習:查看所有數據定義的觸發器

連接到Information_schema數據庫,輸入以下命令查看所有觸發器

SELECT * FROM INFORMATION_SCHEMA.TRIGGERS

clip_image017

clip_image018

10. 練習:刪除觸發器

刪除觸發器,觸發器名字區分大小寫。

drop trigger limitSex




本文轉自 onesthan 51CTO博客,原文鏈接:http://blog.51cto.com/91xueit/1137982,如需轉載請自行聯系原作者

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/393475.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/393475.shtml
英文地址,請注明出處:http://en.pswp.cn/news/393475.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue使用python_如何使用Python和Vue創建兩人游戲

vue使用pythonby Neo Ighodaro由新Ighodaro 如何使用Python和Vue創建兩人游戲 (How to create a two-player game with Python and Vue) In this tutorial, we will create a realtime tic-tac-toe game using Python and Pusher channels. Here’s a demo of how the game wi…

掩碼圖制作photoshop__新手用

1.首先你得有一張圖,比如這樣的: 2.用PS打開他 3.左邊工具欄里(快速選擇工具W),選想顯示的部分 4.ctrlc復制一下,新建一張黑底圖粘貼上去或者白底圖時選中顯示區即花瓣右鍵反向右鍵填充成黑色 5.菜單欄->…

leetcode287. 尋找重復數(二分法)

給定一個包含 n 1 個整數的數組 nums,其數字都在 1 到 n 之間(包括 1 和 n),可知至少存在一個重復的整數。假設只有一個重復的整數,找出這個重復的數。 示例 1: 輸入: [1,3,4,2,2] 輸出: 2 代碼 class Solution {…

os-enviroment

pip3 install PyUserInput ping 是不帶協議的轉載于:https://www.cnblogs.com/liuweimingcprogram/p/10957592.html

java 壓縮 亂碼_如何解決java壓縮文件亂碼問題

用java來打包文件生成壓縮文件,有兩個地方會出現亂碼:內容的中文亂碼問題:修改sun的源碼。使用開源的類庫org.apache.tools.zip.ZipOutputStream和org.apache.tools.zip.ZipEntry,這兩個類ant.jar中有,可以下載使用即可…

Unity3D手機斗地主游戲開發實戰(02)_叫地主功能實現

大體思路 前面我們實現了點擊開始游戲按鈕,系統依次給玩家發牌的邏輯和動畫,并展示當前的手牌。這期我們繼續實現接下來的功能--叫地主。 1.首先這兩天,學習了DOTween,這是一個強大的Unity動畫插件,大家可以參考&#…

TensorFlow 學習(十)—— 工具函數

1. 基本 tf.clip_by_value() 截斷,常和對數函數結合使用 # 計算交叉熵crose_ent -tf.reduce_mean(tf.log(y_*tf.clip_by_value(y, 1e-10, 1.))) a tf.reshape(tf.range(6, dtypetf.float32), [2, 3]) tf.clip_by_value(a, 2.5, 4.5) # 將值限定在 2.5 …

delphi5開發人員指南_非設計人員的網頁設計開發人員指南

delphi5開發人員指南I created my first website as a school project when I was 14. The task was simple: create a very basic site including some text, images, and a table. My usual attitude to school projects was to completely forget about them and later come…

leetcode1292. 元素和小于等于閾值的正方形的最大邊長(二分法+前綴和)

給你一個大小為 m x n 的矩陣 mat 和一個整數閾值 threshold。 請你返回元素總和小于或等于閾值的正方形區域的最大邊長;如果沒有這樣的正方形區域,則返回 0 。 示例 2: 輸入:mat [[2,2,2,2,2],[2,2,2,2,2],[2,2,2,2,2],[2,2,2…

java 反射 獲取成員_java 反射獲取成員

package com.wxjaa; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; public class TestReflect { public static void main(String[] args) throws Exception { // getDeclaredField 可以獲取私有成員, …

Koa 中實現 chunked 數據傳輸

有關于 Transfer-Encoding:chunked 類型的響應,參見之前的文章HTTP 響應的分塊傳輸。這里看 Koa 中如何實現。 Koa 中請求返回的處理 雖然官方文檔有描述說明不建議直接調用 response.write: Bypassing Koas response handling is not supported. Avoid …

git 短寫設置_如何在短短幾分鐘內設置一個Git客戶端

git 短寫設置Today we’re going to talk about Git. You’re going to learn what Git is and how to set up a Git client on your computer.今天我們將討論Git。 您將學習什么是Git,以及如何在計算機上設置Git客戶端。 什么是Git? (What is Git?) I…

P1977 出租車拼車

P1977 出租車拼車 題目背景 話說小 x 有一次去參加比賽,雖然學校離比賽地點不太遠,但小 x 還是想坐 出租車去。大學城的出租車總是比較另類,有“拼車”一說,也就是說,你一個人 坐車去,還是一堆人一起&#…

leetcode1011. 在 D 天內送達包裹的能力(二分查找)

傳送帶上的包裹必須在 D 天內從一個港口運送到另一個港口。 傳送帶上的第 i 個包裹的重量為 weights[i]。每一天,我們都會按給出重量的順序往傳送帶上裝載包裹。我們裝載的重量不會超過船的最大運載重量。 返回能在 D 天內將傳送帶上的所有包裹送達的船的最低運載…

java集合概念_JAVA集合概念

Java集合是使程序能夠存儲和操縱元素不固定的一組數據。 所有Java集合類都位于java.uti包中。與Java數組不同,Java集合中不能存放基本數據類型,只能存放對象的引用。但是在JDK5.0以后的版本當中,JAVA增加了“自動裝箱”和“自動拆箱”的機制&…

項目計劃總結

項目計劃總結 任務 日期 聽課(min) 編程(min) 閱讀課本(min) 日總結(min) 2017/3/13 120 70 190 2017/3/14 80 80 2017/3/15 90 30 120 2017/3/16 …

HTML5新特性之Mutation Observer

Mutation Observer(變動觀察器)是監視DOM變動的接口。當DOM對象樹發生任何變動時,Mutation Observer會得到通知。 要概念上,它很接近事件。可以理解為,當DOM發生變動會觸發Mutation Observer事件。但是,它與…

leetcode230. 二叉搜索樹中第K小的元素(中序遍歷)

給定一個二叉搜索樹,編寫一個函數 kthSmallest 來查找其中第 k 個最小的元素。說明: 你可以假設 k 總是有效的,1 ≤ k ≤ 二叉搜索樹元素個數。示例 1:輸入: root [3,1,4,null,2], k 13/ \1 4\2 輸出: 1解題思路 變量 cnt:統計已經按序遍…

Python操作MongoDB - 極簡教程

2019獨角獸企業重金招聘Python工程師標準>>> Python 連接 MongoDB 安裝PyMongo模塊 pip install pymongo使用MongoClient建立連接 from pymongo import MongoClient # 以下為三種建立連接的方式 #client MongoClient() #client MongoClient(localhost, 27017) #cl…

nuxt.js的核心代碼_Nuxt.js中的通用應用程序代碼結構

nuxt.js的核心代碼by Krutie Patel通過克魯蒂帕特爾(Krutie Patel) Nuxt.js中的通用應用程序代碼結構 (Universal application code structure in Nuxt.js) Nuxt.js中的源代碼結構的簡要摘要 (A brief summary of source code structure in Nuxt.js) Are you new to the Nuxt.…