Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Prosedur tersimpan yang secara otomatis menghapus baris yang lebih lama dari 7 hari di MYSQL

Mysql memiliki fungsionalitas EVENT untuk menghindari interaksi cron yang rumit ketika banyak dari apa yang Anda jadwalkan terkait dengan sql, dan lebih sedikit terkait file. Lihat halaman Manual di sini . Semoga yang di bawah ini dapat dibaca sebagai ikhtisar singkat tentang langkah-langkah penting dan hal-hal yang perlu dipertimbangkan, dan juga pengujian yang dapat diverifikasi.

show variables where variable_name='event_scheduler';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | OFF   |
+-----------------+-------+

ooops, penjadwal acara tidak dihidupkan. Tidak ada yang akan memicu.

SET GLOBAL event_scheduler = ON; -- turn her on and confirm below

show variables where variable_name='event_scheduler';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | ON    |
+-----------------+-------+

Skema untuk pengujian

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

Buat 2 acara, sesi pertama setiap hari, sesi kedua setiap 10 menit

Abaikan apa yang sebenarnya mereka lakukan (bermain melawan satu sama lain). Intinya ada di time difference pendekatan dan penjadwalan .

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 ;

Tampilkan status acara (pendekatan berbeda)

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)

Hal-hal acak untuk dipertimbangkan

drop event someEventName; -- <----- hal yang baik untuk diketahui tentang

tidak bisa alias dateiff dan menggunakan klausa di mana dalam 1 baris, jadi

select id,DATEDIFF(now(),updateDt) from theMessages where datediff(now(),updateDt)>6;

dapatkan lebih tepat, 168 jam untuk usia 1 minggu

select id,TIMESTAMPDIFF(HOUR, updateDt, now()) as `difference` FROM theMessages;
+----+------------+
| id | difference |
+----+------------+
|  1 |        410 |
|  2 |        301 |
|  3 |        169 |
|  4 |        167 |
+----+------------+

Tautan ke Halaman Manual menunjukkan sedikit fleksibilitas dengan pilihan interval, ditunjukkan di bawah ini:

interval:

quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
          WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
          DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

Konkurensi

Sematkan tindakan konkurensi apa pun yang diperlukan agar beberapa peristiwa (atau beberapa pengaktifan peristiwa yang sama) tidak menyebabkan data mengamuk.

Setel dan Lupakan

Ingat, untuk saat ini, karena Anda akan melupakannya, peristiwa-peristiwa ini terus berlanjut. Jadi buatlah kode solid yang akan terus berjalan, bahkan saat Anda lupa. Yang kemungkinan besar akan Anda lakukan.

Persyaratan khusus Anda

Anda perlu menentukan baris mana yang perlu dihapus terlebih dahulu oleh tabel, sehingga memenuhi batasan Kunci Utama. Cukup gabungkan semuanya dalam urutan yang benar di dalam area yang jelas melalui pernyataan CREATE EVENT, yang bisa sangat besar.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Perbaiki "ERROR 1250 (42000):Tabel '...' dari salah satu SELECT tidak dapat digunakan dalam klausa ORDER global" saat menggunakan UNION di MySQL

  2. Dalam SQL / MySQL, apa perbedaan antara ON dan WHERE dalam pernyataan bergabung?

  3. Kesalahan saat memuat Modul MySQLdb 'Apakah Anda menginstal mysqlclient atau MySQL-python?'

  4. Cara Menyimpan Hasil Query MySQL ke File .CSV

  5. Bagaimana cara mengonversi dari BLOB ke TEXT di MySQL?