MySQL之如何使用觸發(fā)器

觸發(fā)器:它是一個(gè)特殊的存儲(chǔ)過(guò)程,它是MySQL在insert、update、delete的時(shí)候執(zhí)行,自動(dòng)執(zhí)行,不能直接調(diào)用。

它包含四個(gè)要素:

  1. 監(jiān)視地點(diǎn)(table)

  2. 監(jiān)視事件(insert/update/delete)

  3. 觸發(fā)時(shí)間(after/before)

  4. 觸發(fā)事件(insert/update/delete)

觸發(fā)器

  1. 語(yǔ)法:
    create trigger trigger_name

    after/before   insert/update/delete on tb_name

    for each row

    begin

    sql 語(yǔ)句:(觸發(fā)的語(yǔ)句一句或者多句)

    end;
  1. 現(xiàn)有兩張表 商品表 goods 和訂單表 order 來(lái)說(shuō)明觸發(fā)器的工作原理;


    (http://jingyan.baidu.com/album/154b46311c9aed28cb8f4159.html?picindex=2)

  2. 我們現(xiàn)在往goods表添加四條記錄:

 insert into goods (goods_name,goods_num)values("手機(jī)",20),("電腦",30),("單反",20);
  1. 實(shí)現(xiàn)購(gòu)買任意商品,對(duì)應(yīng)的商品數(shù)量相應(yīng)的減少:

    分析:

    監(jiān)視地點(diǎn):order 表

    監(jiān)視事件:insert操作

    觸發(fā)時(shí)間:在insert操作之后

    觸發(fā)事件:update操作

    CREATE TRIGGER t1

    AFTER  INSERT ON `order`

    FOR EACH ROW

    BEGIN

    UPDATE goods SET goods_num=goods_num-new.order_num WHERE goods_id=new.goods_id;

    END;
  1. 如 我們購(gòu)買5個(gè)手機(jī):

    INSERT INTO order (goods_id,order_num) VALUES(1,5);

    注:對(duì)于insert 而言 新增的行使用new 來(lái)表示,行中的每一列的值用 new.列名來(lái)表示

    這時(shí)我們會(huì)發(fā)現(xiàn)goods表、order表的數(shù)據(jù)如下:


    (http://jingyan.baidu.com/album/154b46311c9aed28cb8f4159.html?picindex=4)

  2. 2.撤銷訂單:

    分析:

    監(jiān)視地點(diǎn):order 表

    監(jiān)視事件:delete操作

    觸發(fā)時(shí)間:在delete操作之后

    觸發(fā)事件:update操作

    DROP TRIGGER if EXISTS t1;

    CREATE TRIGGER t1

    AFTER DELETE ON `order`

    FOR EACH ROW

    BEGIN

    UPDATE goods SET goods_num=goods_num+old.order_num WHERE goods_id=old.goods_id;

    END;
  1. 現(xiàn)在要取消剛才買的5個(gè)手機(jī)的訂單:

    DELETE FROM order WHERE order_id=1;

    注:對(duì)于delete而言 刪除的行使用old 來(lái)表示, 行中的每一列的值用 old.列名來(lái)表示

    這時(shí)我們會(huì)發(fā)現(xiàn)goods表、order表的數(shù)據(jù)發(fā)生了如下的變化:

(http://jingyan.baidu.com/album/154b46311c9aed28cb8f4159.html?picindex=6)

  1. 修改訂單(包括修改購(gòu)買的數(shù)量以及購(gòu)買的商品)

    分兩步:

    1. 撤銷訂單;(delete);

    2. 新增訂單:(insert);

    DROP TRIGGER if EXISTS t1;

    CREATE TRIGGER t1

    AFTER UPDATE ON `order`

    FOR EACH ROW

    BEGIN

    #撤銷訂單

    UPDATE goods SET goods_num=goods_num+old.order_num WHERE goods_id=old.goods_id;

    #新增訂單

    UPDATE goods SET goods_num=goods_num-new.order_num WHERE goods_id=new.goods_id;

    END;
UPDATE `order` SET goods_id=2,order_num=4 WHERE order_id=2;

現(xiàn)在看下兩張表的變化:

[![MySQL之如何使用觸發(fā)器](http://upload-images.jianshu.io/upload_images/11222021-ac615935f8bf6d7a.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)](http://jingyan.baidu.com/album/154b46311c9aed28cb8f4159.html?picindex=7) 

(http://jingyan.baidu.com/album/154b46311c9aed28cb8f4159.html?picindex=8)

注意:

如果在執(zhí)行創(chuàng)建觸發(fā)器的時(shí)候語(yǔ)句報(bào)錯(cuò)

那在 語(yǔ)句之前添加

delimiter $$
CREATE TRIGGER t1
AFTER  INSERT ON order
...
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容