Mysql có chức năng EVENT để tránh các tương tác cron phức tạp khi phần lớn những gì bạn đang lập lịch liên quan đến sql và ít liên quan đến tệp hơn. Xem trang Hướng dẫn tại đây . Hy vọng rằng phần dưới đây là một cái nhìn tổng quan nhanh về các bước quan trọng và những điều cần xem xét cũng như thử nghiệm có thể xác minh.
show variables where variable_name='event_scheduler';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| event_scheduler | OFF |
+-----------------+-------+
rất tiếc, trình lên lịch sự kiện chưa được bật. Không có gì sẽ kích hoạt.
SET GLOBAL event_scheduler = ON; -- turn her on and confirm below
show variables where variable_name='event_scheduler';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| event_scheduler | ON |
+-----------------+-------+
Lược đồ để kiểm tra
create table theMessages
( id int auto_increment primary key,
userId int not null,
message varchar(255) not null,
updateDt datetime not null,
key(updateDt)
-- FK's not shown
);
-- it is currently 2015-09-10 13:12:00
-- truncate table theMessages;
insert theMessages(userId,message,updateDt) values (1,'I need to go now, no followup questions','2015-08-24 11:10:09');
insert theMessages(userId,message,updateDt) values (7,'You always say that ... just hiding','2015-08-29');
insert theMessages(userId,message,updateDt) values (1,'7 day test1','2015-09-03 12:00:00');
insert theMessages(userId,message,updateDt) values (1,'7 day test2','2015-09-03 14:00:00');
Tạo 2 sự kiện, lần 1 diễn ra hàng ngày, lần 2 diễn ra 10 phút một lần
Bỏ qua những gì họ đang thực sự làm (chơi với nhau). Điểm là ở time difference
phương pháp tiếp cận và lập lịch .
DELIMITER $$
CREATE EVENT `delete7DayOldMessages`
ON SCHEDULE EVERY 1 DAY STARTS '2015-09-01 00:00:00'
ON COMPLETION PRESERVE
DO BEGIN
delete from theMessages
where datediff(now(),updateDt)>6; -- not terribly exact, yesterday but <24hrs is still 1 day
-- etc etc all your stuff in here
END;$$
DELIMITER ;
...
DELIMITER $$
CREATE EVENT `Every_10_Minutes_Cleanup`
ON SCHEDULE EVERY 10 MINUTE STARTS '2015-09-01 00:00:00'
ON COMPLETION PRESERVE
DO BEGIN
delete from theMessages
where TIMESTAMPDIFF(HOUR, updateDt, now())>168; -- messages over 1 week old (168 hours)
-- etc etc all your stuff in here
END;$$
DELIMITER ;
Hiển thị trạng thái sự kiện (các cách tiếp cận khác nhau)
show events from so_gibberish; -- list all events by schema name (db name)
show events; -- <--------- from workbench / sqlyog
show events\G;` -- <--------- I like this one from mysql> prompt
*************************** 1. row ***************************
Db: so_gibberish
Name: delete7DayOldMessages
Definer: [email protected]
Time zone: SYSTEM
Type: RECURRING
Execute at: NULL
Interval value: 1
Interval field: DAY
Starts: 2015-09-01 00:00:00
Ends: NULL
Status: ENABLED
Originator: 1
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
*************************** 2. row ***************************
Db: so_gibberish
Name: Every_10_Minutes_Cleanup
Definer: [email protected]
Time zone: SYSTEM
Type: RECURRING
Execute at: NULL
Interval value: 10
Interval field: MINUTE
Starts: 2015-09-01 00:00:00
Ends: NULL
Status: ENABLED
Originator: 1
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
2 rows in set (0.06 sec)
Nội dung ngẫu nhiên cần xem xét
drop event someEventName;
- <----- một điều tốt để biết về
không thể đặt bí danh dateiff và sử dụng mệnh đề where trong 1 dòng, vì vậy
select id,DATEDIFF(now(),updateDt) from theMessages where datediff(now(),updateDt)>6;
chính xác hơn, 168 giờ cho 1 tuần tuổi
select id,TIMESTAMPDIFF(HOUR, updateDt, now()) as `difference` FROM theMessages;
+----+------------+
| id | difference |
+----+------------+
| 1 | 410 |
| 2 | 301 |
| 3 | 169 |
| 4 | 167 |
+----+------------+
Liên kết đến Trang hướng dẫn sử dụng hiển thị khá linh hoạt với các lựa chọn khoảng thời gian, được hiển thị bên dưới:
khoảng thời gian:
quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE | WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE | DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}
Đồng tiền
Nhúng bất kỳ biện pháp đồng thời nào cần thiết để nhiều sự kiện (hoặc nhiều lần xuất hiện của cùng một sự kiện) không làm cho dữ liệu chạy amok.
Đặt và quên
Hãy nhớ rằng, bây giờ, bởi vì bạn sẽ quên nó, rằng những sự kiện này cứ tiếp tục diễn ra. Vì vậy, hãy xây dựng bằng mã vững chắc sẽ tiếp tục chạy, ngay cả khi bạn quên. Điều mà bạn có nhiều khả năng sẽ làm.
Yêu cầu cụ thể của bạn
Bạn cần xác định hàng nào cần được xóa trước theo bảng, sao cho nó tôn trọng các ràng buộc Khóa chính. Chỉ cần gộp tất cả chúng lại theo thứ tự thích hợp bên trong khu vực hiển nhiên thông qua câu lệnh CREATE EVENT, câu lệnh này có thể rất lớn.