Maison > Questions et réponses > le corps du texte
Fonctionnement sur le serveur local phpMyAdmin :
J'ai deux tables : user
(有数据)和user_t
(vide).
Ils ont les mêmes noms de colonnes, ordre et type (user_t
la table a une colonne supplémentaire pour horodater l'entrée).
Je souhaite créer un 计划事件
来检查每个用户日志的时间戳
是否具有特定值,如果存在,我想将其复制到user_t
同时从 user
pour le supprimer. très simple.
La suppression fonctionne bien. C'est le INSERT INTO user_t SELECT * FROM user WHERE user.reg < CURRENT_TIMESTAMP - INTERVAL 3 MINUTE;
qui me cause des ennuis.
Voici le code que j'ai utilisé pour créer l'événement :
CREATE EVENT users_u ON SCHEDULE EVERY 1 MINUTE STARTS CURRENT_TIMESTAMP ENDS CURRENT_TIMESTAMP + INTERVAL 1 HOUR DO INSERT INTO user_t SELECT * FROM user WHERE user.reg < CURRENT_TIMESTAMP - INTERVAL 3 MINUTE; DELETE FROM user WHERE reg < CURRENT_TIMESTAMP - INTERVAL 3 MINUTE;
Cependant, il revient sans cesse 空结果
. Alors, j'ai pensé que je devais faire quelque chose de mal.
Pouvez-vous sincèrement m'aider à faire fonctionner ce code ? Après tout, cela vient d'un tutoriel et ça devrait aller.
J'ai essayé d'utiliser du code et j'ai même envisagé de faire des recherches 事务
mais cela me semble trop volumineux pour ce genre d'opération.
Donc, après avoir joué avec le code de nbk, j'ai finalement compris et voici le code qui a fonctionné pour moi (j'ai généralisé les noms de tables et de colonnes pour qu'ils n'induisent personne en erreur) :
DELIMITER $$ CREATE EVENT event_name ON SCHEDULE EVERY 1 MINUTE STARTS CURRENT_TIMESTAMP ENDS CURRENT_TIMESTAMP + INTERVAL 1 HOUR DO BEGIN INSERT INTO empty_table (col_name1, col_name2, col_name3, col_name4, col_name5) SELECT col_name1, col_name2, col_name3, col_name4, col_name5 FROM data_table WHERE col_name < CURRENT_TIMESTAMP - INTERVAL 3 MINUTE; DELETE FROM data_table WHERE col_name < CURRENT_TIMESTAMP - INTERVAL 3 MINUTE; END $$ DELIMITER ;
J'espère que cela aidera les gens comme moi à l'avenir. Merci encore nbk pour l'aide rapide. Merci beaucoup, bien sûr votre réponse est correcte.
P粉0927785852023-09-10 00:57:50
Vous exécutez l'événement toutes les minutes et souhaitez saisir les trois dernières minutes, je ne sais pas si vous avez autant de nouvelles insertions ou si vous avez besoin d'un script python ou d'une insertion comme celle-ci pendant une heure ==>À des fins de tests, j'ai réglé la fréquence sur 1 minute...
Vous devriez toujours réécrire vos événements.
Tout d'abord, voulez-vous vraiment des doublons, peut-être INSERT IGNORE
, si la contrainte est violée, une nouvelle ligne entrera
Deuxièmement, si vous avez plus d'une déclaration, vous en avez besoin d'une BEGIN END
DELIMITER $$ CREATE EVENT users_u ON SCHEDULE EVERY 1 MINUTE STARTS CURRENT_TIMESTAMP ENDS CURRENT_TIMESTAMP + INTERVAL 1 HOUR DO BEGIN INSERT IGNORE INTO user_t SELECT * FROM user WHERE user.reg < CURRENT_TIMESTAMP - INTERVAL 3 MINUTE; DELETE FROM user WHERE reg < CURRENT_TIMESTAMP - INTERVAL 3 MINUTE; END $$ DELIMITER ;