什么是触发器?
在事件发生时自动执行
所有这些例子的共同之处是它们都需要在某个表发生更改(增删改)时自动处理。这确切地说就是触发器。
如何使用触发器?
创建触发器
USE mysql_must_study;
DELIMITER $$
$$
CREATE TRIGGER newproduct
AFTER INSERT
ON products FOR EACH ROW
SELECT 'Product added' INTO @res;
$$
DELIMITER ;
MYSQL5以后,不允许触发器返回任何结果,因此使用into @变量名,将结果赋值到变量中,用select调用即可。
修改表后查看res变量值,未修改前是NULL。
SELECT @res;
只有表才支持触发器,触发器按每个表每个事件每次地定义,每个表每个事件每次只允许一个触发器。
每个表最多支持6个触发器(每条INSERT、UPDATE和DELETE的之前和之后)。单一触发器不能与多个事件或多个表关联,所以,如果你需要一个对INSERT和UPDATE操作执行的触发器,则应该定义两个触发器。
删除触发器
INSERT触发器
可以通过insert触发器查询自增的id值
USE mysql_must_study;
DELIMITER $$
$$
CREATE TRIGGER neworder
AFTER INSERT
ON orders FOR EACH ROW
SELECT NEW.order_num INTO @ID;
$$
DELIMITER ;
SELECT @ID;
一开始默认是NULL
插入后再查看
INSERT INTO orders(order_date,cust_id) VALUES (Now(),10001);
SELECT @ID;
DELETE触发器
USE mysql_must_study;
DELIMITER $$
$$
CREATE TRIGGER deleteorder
BEFORE DELETE
ON orders FOR EACH ROW
BEGIN
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.orders
WHERE order_num=20011;
UPDATE触发器
下面的例子保证州名 vend_state 缩写总是大写(不管UPDATE语句中给出的是大写还是小写)
USE mysql_must_study;
DELIMITER $$
$$
CREATE TRIGGER updatevendor
BEFORE UPDATE
ON vendors FOR EACH ROW
SET NEW.vend_state = upper(NEW.vend_state); $$
DELIMITER ;
更新后
UPDATE mysql_must_study.vendors
SET vend_name='aaa', vend_address='aaa', vend_city='aaa', vend_state='aad', vend_zip='666', vend_country='UU'
WHERE vend_id=1007;