Mysql
 sql >> база данни >  >> RDS >> Mysql

Съхранена процедура, която автоматично изтрива редове, по-стари от 7 дни в MYSQL

Mysql има своята EVENT функционалност за избягване на сложни взаимодействия с cron, когато голяма част от това, което планирате, е свързано с sql и по-малко свързано с файл. Вижте страницата наръчник тук . Надяваме се по-долу да се чете като бърз преглед на важните стъпки и неща, които трябва да се вземат предвид, както и тестване, което може да се провери.

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

опа, планировчикът на събития не е включен. Нищо няма да се задейства.

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

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

Схема за тестване

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

Създайте 2 събития, 1-во бягане ежедневно, 2-ро бягане на всеки 10 минути

Игнорирайте какво всъщност правят (играят един срещу друг). Въпросът е в time difference подходи и сначване .

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 ;

Показване на състояния на събития (различни подходи)

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)

Случайни неща за разглеждане

drop event someEventName; -- <----- хубаво е да знаете за

не може да се използва псевдоним datediff и се използва клауза where в 1 ред, така че

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

по-точно, 168 часа за 1 седмица на възраст

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

Връзката към ръчната страница показва доста гъвкавост с избор на интервали, показани по-долу:

интервал:

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

Конкурентност

Вграждане на всички необходими мерки за едновременност, за да може множество събития (или множество задействания на едно и също събитие) да не доведат до безумие на данните.

Задайте и забравете

Помнете, засега, защото ще го забравите, че тези събития просто продължават да стрелят. Така че вградете солиден код, който просто ще продължи да работи, дори когато забравите. Което най-вероятно ще направите.

Вашите конкретни изисквания

Трябва да определите кои редове трябва да бъдат изтрити първо от таблица, така че да спазва ограниченията на първичния ключ. Просто ги подредете в правилен ред в очевидната област чрез израза CREATE EVENT, който може да бъде огромен.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Създаване на уеб приложение от нулата с помощта на Python Flask и MySQL:Част 4

  2. Какъв тип/дължина на колона трябва да използвам за съхраняване на хеширана парола на Bcrypt в база данни?

  3. Как да конвертирате дата и час в UTC в MySQL

  4. Как да проверите версията на MySQL

  5. MySQL Great Circle Distance (формула на Haversine)