1.概念:触发器是mysql响应insert、update、delete语句时自动执行的一条SQL语句。mysql
- #1.建立两个测试表
- USE mydb;
- #表1:t_tableA
- CREATE TABLE t_tableA(
- id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
- val VARCHAR(20)
- );
- #表2:t_tableB
- CREATE TABLE t_tableB(
- id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
- val VARCHAR(20)
- );
- #2.建立insert后置触发器
- CREATE TRIGGER tr_insert_tableA /*tr_insert_tableA是触发器的名称*/
- AFTER INSERT ON t_tableA /*一个后置在t_tableA表上的insert的触发器*/
- FOR EACH ROW /*对全部代码行都执行*/
- INSERT INTO t_tableB(val) VALUES(new.val); /*触发器的内容,将
- a表中插入的数据放到b表中一份,insert触发器会访问一个名称为new的虚拟表,获取刚插入的值*/
- /*测试一下上面的insert后置触发器*/
- INSERT INTO t_tableA(val) VALUES('ok');
- /*
- 说明:
- ①在insert触发器内,可引用一个名为new的虚拟表,访问被插入的行
- ②在beforeInsert触发器中,new中的值也能够被更新(运行更改被插入的值)
- ③对于自动增加列,new在insert执行以前的值为0,在执行以后是新的自动生成的值
- */
- #第二个触发器:得到刚刚插入的自动生成的主键值 (注意:你应该把上面的一个触发器删掉再建立这个啊!!)
- CREATE TRIGGER t_insert_pk_tableA
- AFTER INSERT ON t_tableA
- FOR EACH ROW
- SELECT new.id INTO @id;
- /*测试一下*/
- INSERT INTO t_tableA(val) VALUES('no');
- SELECT @id;
- eg.建立一个触发器,将a表中修改后的名字都更改成大写!!
- DELIMITER //
- CREATE TRIGGER t_update_tableA
- BEFORE UPDATE ON t_tableA
- FOR EACH ROW
- BEGIN
- SET new.val = UPPER(new.val); /*so important!!*/
- END //
- DELIMITER ;
- 测试一下上面的触发器:
- UPDATE t_tableA SET val='xyz' WHERE id=1;
- /*把从a表删除的数据,插入到b表中,能够做为备份用!*/
- DELIMITER //
- CREATE TRIGGER t_delete_tableA
- AFTER DELETE ON t_tableA
- FOR EACH ROW
- BEGIN
- INSERT INTO t_tableB(val) VALUES(old.val);
- END //
- DELIMITER ;
- /*测试一把:*/
- DELETE FROM t_tableA WHERE id=1;