MySQL触发器——在删除记录前备份此记录到备份表
由于有需求要备份记录,所以搜寻了一个正常运行的SQL,发文以作记录
References:
- http://blog.sina.com.cn/s/blog_62b080970100nxw1.html yuzhili的博客
- https://dev.mysql.com/doc/refman/5.7/en/trigger-syntax.html MySQL官方文档
在删除表中一条记录的时候备份此记录到备份表,此触发器一般用在记录比较多的表中,删除一些不经常查询的记录,把这些不重要的记录放置到一个备份表中,这样减少了主表中不重要的记录,加快了对主表的查询速度,又保留了不重要的记录,以便以后查询用。
适应场合举例:银行交易记录等。
背景:银行交易记录的数据是很多的,但是有些时间久远的数据一般不常查询,放在表中降低了表的查询速度。如果定期把一年或者二年之前的交易记录删除,自动备份到辅表中。这样可以大大加快主表的查询速度,而且也保存了原有数据。
这里我在本地建了个测试的表以作演示,就不照搬原文的代码了。
主表如下:
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
表只有两个字段,id
和name
。
备份表和主表一样,只是换个名字。触发器定义如下:
CREATE TRIGGER `del_bak` BEFORE DELETE ON `user` FOR EACH ROW INSERT INTO user_del_bak (`id`, `name`) SELECT
`id`, `name`
FROM
USER
WHERE
id = old.id
old表示一种状态,删除动作执行之前的表称OLD表,删除动作执行之后的表称NEW表。
这里触发器的查询指定了具体的字段名,因为在之前实际项目中发现可能会字段名顺序不一样的情况(增量开发)。所以这里指定了字段名就好了,如果是直接拷贝并且确定不会再修改表结构了,可以直接用SELECT *
也行。