建立觸發器報錯 MySQL觸發器demo

2021-10-14 17:33:42 字數 2090 閱讀 1176

最近在帶浙大本科生的資料庫系統的上機課,我手裡拿到的教學文件非常的老,本人及不習慣老文件裡的sql server的操作,就讓大家安裝的mysql,這就有了個問題:mysql上很多sqlserver的操作都無法實現,寫觸發器時大家遇到很多問題就來問我,於是我探索了一下mysql觸發器的使用。

假設有乙個借書記錄表,規定一張借書卡一學期只能借至多2本書,當借第三本書時,觸發器觸發,輸出不能借三本書,並自動回滾。

建立資料庫借書記錄borrow: 各屬性(卡號,借書證號,借期,還期)的型別如下:

cno     char(7),

bno char(8),

borrow_date date,

return_date date,

插入兩條資料:

1. ('cno4','bno1','2010-9-4','2010-9-10');

2. ('cno4','bno2','2010-9-4','2010-9-10');

結果如下圖所示:

**如下:

delimiter ||

create trigger borrow_warning after insert on borrow for each row

begin

declare num int;

declare msgs varchar(60);

set num =(select count(cno) from borrow where cno=new.cno);

if num>2 then

select 'cannot brorow three books' into @msgs;

delete from borrow where cno=new.cno and bno=new.bno ;

end if;

end ||

建立觸發器後記得取消符號宣告:delimiter ;,後面才能正常使用;需要注意的是:

1 mysql的觸發器中沒有print函式,所以我定義了乙個變數msgs,當借了三本書條件觸發時,我將需要輸出的資訊傳入變數msgs

2 mysql的觸發器中沒有rollback,所以我曲線救國,用delete將新插入的那條記錄刪除(當然這條刪除語句在某些情況下會刪錯,這裡我就懶得深究了)

在此之前我們以插入了兩條記錄,並且兩條記錄的cno都是cno4,先檢視一下msgs的值:

還沒有值,因為我們的觸發器還沒有觸發(雖然我事先插入兩條資料,再建立的觸發器,不過邏輯上肯定是應該msgs=null的)。那麼我再插入一條資料:

報錯了,提示無法更新borrow表,其實就是插入了同乙個cno的第三條借書記錄,觸發了觸發器,再看看msgs是什麼呢:

這正是我們想要的結果。

mysql觸發器是個天坑,花了我幾個小時寫這玩意兒,有條件的同學去用sqlserver試試。****,觸發器裡的borrow打成了brorow.

my sql 觸發器 mysql建立觸發器

首先,我們來了解一下什麼是觸發器,觸發器,就是在對一張表資料進行增 insert 刪 delete 改 update 的時候,為了保持資料的一致性,對別的表也要進行相應的資料修改。我們都知道mysql最後事務提交後,資料是會儲存到磁碟上的,那麼每次在insert,delete,update時候舊資料...

觸發器 mysql觸發器

觸發器是一種特殊的儲存過程,它在插入 刪除或修改特定表中的資料時觸發執行,它比資料庫本身標準的功能有更精細和更複雜的資料控制能力。和儲存過程一樣,很少使用。1 觸發器的作用 2 建立觸發器 建立測試環境 mysql create database test db query ok,1 row aff...

mysql觸發器when MySQL觸發器

set quoted identifier on goset ansi nulls on goalter trigger trg risks on dbo.projectrisk for insert,update asbegin update projectrisk set classificat...