MySQL实用sql语句之删除日志类数据,只保留最近几天的日志数据
背景:
在项目开发中,不可避免地会创建日志类的数据表。随着日志类数据的增多,需要定期删除旧的日志数据,只保留最近的日志数据,以减轻服务器的压力。
例如,项目中有一张用户表,表名:users,还有一张用户登录数据表,表名:user_login_log。随着user_login_log表数据量的增大,需要我们只保留最近一星期的日志数据。因此我们需要定时将user_login_log表一星期之前的数据删除。
数据表结构:
users表结构:
CREATE TABLE `users` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增无符号主键', `username` varchar(50) NOT NULL DEFAULT '' COMMENT '用户名', `created_at` datetime NOT NULL COMMENT '创建时间', `updated_at` datetime NOT NULL COMMENT '最近一次更新时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户数据表';
user_login_log表结构:
CREATE TABLE `user_login_log` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增无符号主键', `user_id` bigint(20) unsigned NOT NULL COMMENT '用户ID', `login_ip` varchar(50) NOT NULL DEFAULT '' COMMENT '登录IP', `created_at` datetime NOT NULL COMMENT '创建时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户登录数据表';
用户登录数据表删除7天前的数据sql语句:
-- 1条sql语句实现删除7天前的数据 delete from user_login_log where id <= ( select id from ( select max(id) as id from user_login_log where date(created_at) <= date(date_sub(now(), interval 7 day)) ) as a );