MySQL触发器——在删除记录前备份此记录到备份表

由于有需求要备份记录,所以搜寻了一个正常运行的SQL,发文以作记录

References:

在删除表中一条记录的时候备份此记录到备份表,此触发器一般用在记录比较多的表中,删除一些不经常查询的记录,把这些不重要的记录放置到一个备份表中,这样减少了主表中不重要的记录,加快了对主表的查询速度,又保留了不重要的记录,以便以后查询用。

适应场合举例:银行交易记录等。

背景:银行交易记录的数据是很多的,但是有些时间久远的数据一般不常查询,放在表中降低了表的查询速度。如果定期把一年或者二年之前的交易记录删除,自动备份到辅表中。这样可以大大加快主表的查询速度,而且也保存了原有数据。

这里我在本地建了个测试的表以作演示,就不照搬原文的代码了。

主表如下:

-- ----------------------------
-- 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;

表只有两个字段,idname
备份表和主表一样,只是换个名字。触发器定义如下:

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 *也行。

标签: none

添加新评论

ali-01.gifali-58.gifali-09.gifali-23.gifali-04.gifali-46.gifali-57.gifali-22.gifali-38.gifali-13.gifali-10.gifali-34.gifali-06.gifali-37.gifali-42.gifali-35.gifali-12.gifali-30.gifali-16.gifali-54.gifali-55.gifali-59.gif

加载中……