Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Quy trình đã lưu trữ Tự động xóa các hàng cũ hơn 7 ngày trong MYSQL

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. java.sql.SQLException:Quyền truy cập bị từ chối đối với người dùng 'root' @ 'localhost' (sử dụng mật khẩu:CÓ)

  2. Xuất dữ liệu từ Cơ sở dữ liệu MySQL

  3. Tải dữ liệu CSV vào MySQL bằng Python

  4. Truy vấn phân cấp trong MySQL

  5. Giới thiệu về SQL Joins