MySQL:根據時間規則定時清除匹配數據
一 . 場景
有時,我們可能需要定時清除數據庫一些廢棄的數據,可以使用mysql的存儲過程和事件來完成。
提示:本文不對MySQL的事件Event進行詳細介紹,如果想了解詳細內容,請查看文章《MySQL:簡述MySQL中的事件Event》。
二 . 實現
首先創建Table,添加數據,執行語句如下:
drop table if exists table_timestamp;
create table table_timestamp
(
message_pk bigint not null auto_increment,
message_content varchar(99),
/* 創建時間不可爲空*/
CreateTime timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間' ,
primary key (message_pk)
);
/* 初始化數據 */
insert into table_timestamp(message_content,CreateTime) values('a','2019-01-08 12:37:44');
insert into table_timestamp(message_content,CreateTime) values('b','2019-01-09 12:37:44');
insert into table_timestamp(message_content,CreateTime) values('c','2019-01-10 12:37:44');
insert into table_timestamp(message_content,CreateTime) values('d','2019-01-13 12:37:44');
insert into table_timestamp(message_content,CreateTime) values('e','2019-01-14 12:37:44');
1 . 簡單實現:事件
要求:刪除三天以前的數據,實現如下:
select * from table_timestamp;
drop event if exists event_timestamp;
create event event_timestamp
on schedule every 1 minute starts '2019-01-15 10:38:00'
on completion not preserve
enable
do delete from table_timestamp where (to_days(now()) - to_days(createtime))>=3;
select * from table_timestamp;
2 . 複雜實現:事件+存儲過程
要求:根據傳入參數,刪除相應的數據,實現如下:
select * from table_timestamp;
drop procedure if exists procedure_timestamp;
delimiter $$
create procedure procedure_timestamp(in date_inter int)
begin
delete from table_timestamp where (to_days(now()) - to_days(createtime))>=date_inter;
end$$
delimiter ;
drop event if exists event_procedure_timestamp;
create event event_procedure_timestamp
on schedule every 1 minute starts '2019-01-15 10:38:00'
on completion not preserve
enable
do call procedure_timestamp(3);
select * from table_timestamp;
三 . 實現樣例
drop table if exists table_timestamp;
create table table_timestamp
(
message_pk bigint not null auto_increment,
message_content varchar(99),
/* 創建時間不可爲空*/
CreateTime timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間' ,
primary key (message_pk)
);
/* 初始化數據 */
insert into table_timestamp(message_content,CreateTime) values('a','2019-01-08 12:37:44');
insert into table_timestamp(message_content,CreateTime) values('b','2019-01-09 12:37:44');
insert into table_timestamp(message_content,CreateTime) values('c','2019-01-10 12:37:44');
insert into table_timestamp(message_content,CreateTime) values('d','2019-01-13 12:37:44');
insert into table_timestamp(message_content,CreateTime) values('e','2019-01-14 12:37:44');
/* 事件 */
drop event if exists event_timestamp;
create event event_timestamp
on schedule every 1 minute starts '2019-01-15 10:38:00'
on completion not preserve
enable
do delete from table_timestamp where (to_days(now()) - to_days(createtime))>=3;
/* 事件+存儲過程 */
drop procedure if exists procedure_timestamp;
delimiter $$
create procedure procedure_timestamp(in date_inter int)
begin
delete from table_timestamp where (to_days(now()) - to_days(createtime))>=date_inter;
end$$
delimiter ;
drop event if exists event_procedure_timestamp;
create event event_procedure_timestamp
on schedule every 1 minute starts '2019-01-15 10:38:00'
on completion not preserve
enable
do call procedure_timestamp(3);