mysql_触发器

来源:互联网 发布:java识别图片中文文字 编辑:程序博客网 时间:2024/05/29 10:14
                    触发器
1、为什么需要触发器:
    比如老王从员工表里面退休了,一旦delete from emp  马上就触发器把老王放在了退休员工表里面
2、什么是触发器
    MySQL的触发器和存储过程一样,都是嵌入到MySQL的一段程序。
    利用MySQL触发器可以对表进行增、删、改操作同时响应另一张表做出操作。

    语法:
    create trigger triggerName
    after insert on order
    for each row
    UPDATE t_good SET goodNum=goodNum-new.orderNum
     WHERE id=new.orderId;
3、使用:

    CREATE TABLE t_good(
    -- 主键
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    -- 商品名称
    goodName VARCHAR(20),
    -- 商品数量
    goodNum INT UNSIGNED
    )
    CREATE TABLE t_order(
    -- 主键ID
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    -- 订单ID
    orderId INT UNSIGNED,
    -- 订单数量
    orderNum INT UNSIGNED
    )
    -- 插入数据,三本书,数量都是10本。
     INSERT INTO t_good(goodName,goodNum)VALUES('Java编程思想',10),
     ('Java哈哈',10),
     ('Mysql',10)
 
    -- 创建触发器
     CREATE TRIGGER good_order_trigger
     AFTER INSERT ON t_order
     FOR EACH ROW
    UPDATE t_good SET goodNum=goodNum-new.orderNum
     WHERE id=new.orderId;
     -- 要买的第二本书,三本,测试通过。
     INSERT INTO t_order(orderId,orderNum)VALUES(2,3);
      -- 但是我发现还存在两种情况,当用户删除一个订单的时候,
      -- 我们直接删除一个订单,
      -- 我们是不是需要把对应的商品的数量再加上去呢?
      -- 解决这个问题
 
     CREATE TRIGGER good_order_trigger2
     AFTER DELETE ON t_order
     FOR EACH ROW
     UPDATE t_good SET goodNum=(goodNum)+old.orderNum
     WHERE id =old.orderId;
 
     -- 测试triiger 2 OK
     DELETE FROM t_order WHERE id=1;
 
 
     -- 既然都这样了,我们不如把那个也操作了算了。
     -- 还有一个是什么,update是吧,我根据自己的理解来个测试。
 
    CREATE TRIGGER good_order_trigger3
    AFTER UPDATE t_order
    FOR EACH ROW
    UPDATE t_good SET goodNum=goodNum+old.goodNum-new.goodNum
    WHERE id=old.orderId;

 
 

    

4:注意
    new是新插入的数据,old是原来的数据
    insert只会有new,代表着要插入的新记录
    delete只会有old,代表着要删除的记录


    -- 注意,单独的一个表只能有一个触发器,就是insert只能有一个,delete有一个。