前段时间,在医院上线项目,有个需求是:Java 技术往表里一直写入数据,需要我将这些数据在存到另一个表中。当然,业务逻辑也能实现,但是想直接通过 mysql 来解决掉这个问题。于是就接触到了触发器…
触发器可以让你在增、删、改的时候执行一些特定的操作。可以在 mysql 中指定 sql 语句在执行前触发或执行后触发。
业务逻辑中的代码可以交予触发器来实现,触发器实现的也能交予业务逻辑来实现,具体是哪个更好,需要考虑业务逻辑、优化、简便…
delimiter 自定义结束符号
create trigger 触发器名字 触发时间 触发事件 on 表 for each row
begin
-- 触发器内容主体,每行用分号结尾
end
自定义的结束符号
delimiter ;
关于 on 表 for each:触发对象,触发器绑定的实质是表中的所有行,因此当每一行发生指定改变时,触发器就会被触发。
只要数据发生(增删改)
改变,就可以引起触发事件。
发生前
来触发。发生后
来触发。表中的每一行,表
就是触发对象。
new
和 old
触发器针对的是数据库中的每一行记录,每行数据在操作前后都会有一个对应的状态,触发器将没有操作之前的状态保存到 old 关键字中,将操作后的状态保存到 new 中
优点:
缺点:
现在有两张空数据表:
student表
:mysql> desc student;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | tinyint(255) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
| sex | varchar(255) | YES | | NULL | |
+-------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
stulog表
:mysql> desc stulog;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | tinyint(11) | NO | PRI | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
6.1 创建一个触发器
该触发器逻辑:往 student 表中插入(触发条件)一条数据,插入后(触发时间),自动把新数据中的 name
字段给同步到 stulog 表中
mysql> delimiter ##
mysql> -- 创建触发器
mysql> create trigger test after insert on student for each row
-> begin
-> insert into stulog VALUES(null,new.name);
-> end
-> ##
Query OK, 0 rows affected (0.03 sec)
6.2 插入一条数据
mysql> insert into student (name,sex) values("光头强","男");
Query OK, 1 row affected (0.01 sec)
6.3 查看 student 中的数据
mysql> select * from student;
+----+-----------+------+
| id | name | sex |
+----+-----------+------+
| 1 | 光头强 | 男 |
+----+-----------+------+
1 row in set (0.00 sec)
6.4 查看 stulog 中的数据
mysql> select * from stulog;
+----+-----------+
| id | name |
+----+-----------+
| 1 | 光头强 |
+----+-----------+
1 row in set (0.00 sec)
发现已经将新插入的数据光头强
给同步过来了。
mysql> show triggers;
mysql> show create trigger test;
删除一个表的同时,也会自动删除该表上的触发器。另外,触发器不能更新或覆盖,为了修改一个触发器,必须先删除它,再重新创建。
mysql> drop trigger test;
Query OK, 0 rows affected (0.00 sec)
如果含有触发的表是 MYISAM 的,如果其中一个表报错,另一个表也会正常执行。
如果含有触发的表是 InooDb 类型的,那么一个表报错,另一个表将会回滚。
具体是否是使用触发器,需要多方面的考量业务逻辑、硬件容量、并发等各方面因素。
评论区(0)