W.order_num INTO @o_num;
mysql> INSERT INTO orders(order_date, cust_id)
-> VALUES(Now(), 10001);
mysql> SELECT @o_num; +―――-+
| @o_num |
+―――-+
| 20010 |
+―――-+
(2) DELETE触发器
在 DELETE 触发器代码内,你可以引用一个名为 OLD 的虚拟表,访问被删除的行;
OLD 中的值全部都是只读的,不能更新;
mysql> DELIMITER //
mysql> CREATE TRIGGER deletemytable BEFORE DELETE ON mytable
-> FOR EACH ROW
-> BEGIN
-> SELECT OLD.name INTO @n;
-> INSERT INTO mytable_new(name, myphone) VALUES(OLD.name, OLD.phone);
-> END//
mysql> DELETE FROM mytable WHERE name = 'Joy';
mysql> SELECT * FROM mytable_new;
mysql> SELECT @n;
+――+
| @n |
+――+
| Joy |
+――+
在触发器中使用 BEGIN END 块的好处是触发器能容纳多条SQL语句。
(3) UPDATE触发器
在 UPDATE 触发器代码中,你可以引用一个名为 OLD 的虚拟表访问以前(UPDATE语句执行前)的值,引用一个名为 NEW 的虚拟表访问新更新的值;
在 BERFORE UPDATE 触发器中,NEW 中的值可能也被更新(允许更改将要用于UPDATE语句中的值);
OLD中的值全都是只读的,不能更新。
mysql> CREATE TRIGGER updatemytable BEFORE UPDATE ON mytable
-> FOR EACH ROW SET NEW.name = Upper(NEW.name);
mysql> UPDATE mytable SET name = 'John' WHERE myid = 1004;
mysql> SELECT name FROM mytable WHERE myid = 1004;
+――+
| name |
+――+
| JOHN |
+――+
早期版本(具体哪个版本开始可以不知)不允许在触发器代码中使用 CALL 调用存储过程,在 MySQL 5.6 中是可以的。