我們先理解下為什麼有觸發器,用來幹嘛的。沉下心來看完第一段再看後面的就感覺沒啥難度了。(理解最重要)觸發器見名知意,不是用手來開啟的是用腳來開啟的。意思在於我們不是主動去進行呼叫而是我們執行特定的行為時去觸發的;這個理解很關鍵,捕鼠器,捕獸夾,地雷這些東西。沒有一種生物去願意踩這玩意。除非腦子有泡。接下來就可以來看什麼是觸發器了
觸發器建立的時候我們需要給出具體的時間,地點,什麼情況下, 要搞的事情,主要有以下這四個。
要素名字
要素引數
地點(監控的表)
tablename(表名)
事件(觸發的情況)
insert/update/delete
時間before/after
解釋:核心語句格式(第一邊看肯定看起來很累,結合下面的demo就秒懂了):地點:為為哪乙個表新增觸發器。
事件:為執行那種方法時,只能有增刪改可以觸發
時間:指的是在增刪改操作之前還是之後
create triggertrigger_nametrigger_timetrigger_eventontb_namefor each rowtrigger_stmt
➢ trigger_name:觸發器的名稱;
➢ tirgger_time:觸發時機,為 before 或者 after;
➢ trigger_event:觸發事件,為 insert、delete 或者 update;
➢ tb_name:表示建立觸發器的表名,在哪張表上建立觸發器;
➢ trigger_stmt:觸發器的程式體,可以是一條 sql 語句或者是用 begin 和 end 包含的多條語句;
➢ for each row 表示任何一條記錄上的操作滿足觸發事件都會觸發該觸發器。
注意:對同乙個表相同觸發時間和相同觸發事件,只能定義乙個觸發器。(也就是說,乙個表在不同的事件和時間上最後只能有六個觸發器,增加前,增加後,修改前,修改後,刪除前,刪除後),補充: 觸發器中的sql為乙個事物,在begin和end中要麼都成功要麼都失敗 (什麼是事物?)
-- 注意 delimiter $$ 的使用 不懂看儲存過程的那篇
create table `product` (
`pid` int(11) not null auto_increment comment '商品編號',
`pname` varchar(255) not null comment '商品名稱',
`num` int(11) not null comment '庫存',
primary key (`pid`)
) engine=innodb auto_increment=4 default charset=utf8;
insert into `product` values ('1', 'p30', '10');
insert into `product` values ('2', 'mate20', '50');
insert into `product` values ('3', 'nova5', '100');
-- 建立觸發器
delimiter $$
create trigger mytg1 after insert on product for each row
-- 如果語句只有一行 可以直接寫在 for each row 後面可以不用 begin 和 end
begin
update product set num = num+1 where pid=1;
end $$
delimiter;
-- 往商品表插入記錄
insert into `product` values ('4', 'nova5', '100');
-- 查詢商品表商品庫存更新情況
select * from product;
觸發器中還可以宣告臨時變數;
(結合開始的那就話很容易就理解了,對了 面試會問哦)
什麼時觸發器?
觸發器是和表關聯的特殊的儲存過程,可以在插入,刪除或修改表中的資料時觸發執行,比資料庫本身標準的功能有更精細和更複雜的資料控制能力。
觸發器的優點(抄的別人的):
觸發器的缺點:
觸發器的作用:
➢ 安全性:可以基於資料庫的值使使用者具有運算元據庫的某種權利。例如不允許下班後和節假日修改資料庫資料;
➢ 審計:可以跟蹤使用者對資料庫的操作;
➢ 實現複雜的資料完整性規則。例如,觸發器可回退任何企圖吃進超過自己保證金的**;
➢ 提供了執行計畫任務的另一種方法。例如,如果公司的帳號上的資金低於 5 萬元則立即給財務人員傳送警告資料。
新舊資料的處理首先我們想一下,作為觸發器在某時刻捕獲到了乙個sql語句。
語句: update table01 set name = 『李**子』 where id = 1假如該語句執行時觸發了觸發器。那我們怎麼表示新來的資料 『李**子』 和原來的 『張大膽子』 呢?原資料:原來id = 1 的name的值為 張大膽子
這就用到了 new 和 old 關鍵字了。
直接上**
-- 建立表
create table `class` (
`cid` int(11) default null,
`cname` varchar(30) default null,
`tname` varchar(30) default null
) engine=innodb default charset=utf8
-- 該觸發器為前置 在更新語句執行前觸發的 new 代表著將要更新也就是新來的資料,old代表著原來的老資料
delimiter$$
create trigger table01_trigger before update on `class`
for each row
begin
-- 觸發器 嫌棄李**子太醜不要他
if new.`tname` = '李**子' then
set new.`tname` = old.`tname`;
end if;
end$$
delimiter ;
-- 執行 看看結果
update class set tname = '李**子' where `cid` = 1
-- 執行再 看看結果
update class set tname = '隔壁老王' where `cid` = 1
教程卒! 觸發器 mysql觸發器
觸發器是一種特殊的儲存過程,它在插入 刪除或修改特定表中的資料時觸發執行,它比資料庫本身標準的功能有更精細和更複雜的資料控制能力。和儲存過程一樣,很少使用。1 觸發器的作用 2 建立觸發器 建立測試環境 mysql create database test db query ok,1 row aff...
mysql 觸發器的詳細用法
觸發器 一類特殊的資料庫程式,可以監視某種資料的操作 insert update delete 並觸發相關的操作 insert update delete 保護資料的完整性 應用場景 資料同步 例如 當乙個使用者完整資訊儲存在a b c三張表中,傳統方法維護使用者資訊需要將對應的資訊使用條sql語句...
my sql 觸發器 mysql建立觸發器
首先,我們來了解一下什麼是觸發器,觸發器,就是在對一張表資料進行增 insert 刪 delete 改 update 的時候,為了保持資料的一致性,對別的表也要進行相應的資料修改。我們都知道mysql最後事務提交後,資料是會儲存到磁碟上的,那麼每次在insert,delete,update時候舊資料...