本文共 1522 字,大约阅读时间需要 5 分钟。
在事件发生时自动执行
所有这些例子的共同之处是它们都需要在某个表发生更改(增删改)时自动处理。这确切地说就是触发器。
USE mysql_must_study;DELIMITER $$$$CREATE TRIGGER newproductAFTER INSERTON products FOR EACH ROWSELECT 'Product added' INTO @res;$$DELIMITER ;
MYSQL5以后,不允许触发器返回任何结果,因此使用into @变量名,将结果赋值到变量中,用select调用即可。
修改表后查看res变量值,未修改前是NULL。
SELECT @res;
只有表才支持触发器,触发器按每个表每个事件每次地定义,每个表每个事件每次只允许一个触发器。
每个表最多支持6个触发器(每条INSERT、UPDATE和DELETE的之前和之后)。单一触发器不能与多个事件或多个表关联,所以,如果你需要一个对INSERT和UPDATE操作执行的触发器,则应该定义两个触发器。
可以通过insert触发器查询自增的id值
USE mysql_must_study;DELIMITER $$$$CREATE TRIGGER neworderAFTER INSERTON orders FOR EACH ROWSELECT NEW.order_num INTO @ID;$$DELIMITER ;
SELECT @ID;
一开始默认是NULL
插入后再查看
INSERT INTO orders(order_date,cust_id) VALUES (Now(),10001);SELECT @ID;
USE mysql_must_study;DELIMITER $$$$CREATE TRIGGER deleteorderBEFORE DELETE ON orders FOR EACH ROWBEGIN INSERT INTO mysql_must_study.archive_orders (order_num,order_date,cust_id) VALUES (OLD.order_num,OLD.order_date,OLD.cust_id);END $$DELIMITER ;
原本的 archive_orders 表是空的。
现在删除一个订单,被删除的订单到 archive_orders 这来了。
DELETE FROM mysql_must_study.ordersWHERE order_num=20011;
下面的例子保证州名 vend_state 缩写总是大写(不管UPDATE语句中给出的是大写还是小写)
USE mysql_must_study;DELIMITER $$$$CREATE TRIGGER updatevendorBEFORE UPDATE ON vendors FOR EACH ROWSET NEW.vend_state = upper(NEW.vend_state); $$DELIMITER ;
更新后
UPDATE mysql_must_study.vendorsSET vend_name='aaa', vend_address='aaa', vend_city='aaa', vend_state='aad', vend_zip='666', vend_country='UU'WHERE vend_id=1007;
转载地址:http://ppozi.baihongyu.com/