Maison > Questions et réponses > le corps du texte
P粉8313104042023-08-19 00:37:07
Voici la requête que votre événement doit exécuter :
UPDATE devices SET `status` = 'EXP' WHERE EXISTS ( SELECT 1 FROM drivers JOIN device_drivers ON drivers.id = device_drivers.driver_id AND device_drivers.device_id = devices.id WHERE drivers.`expiration date` < now() );
Quant à la création d'événement, vous disposez de plusieurs options, dont certaines sont listées ici :
Quoi qu'il en soit, vous souhaiterez peut-être envelopper votre UPDATE
dans une procédure stockée, et s'il y a plus d'écritures, vous souhaiterez peut-être également envelopper une transaction lorsque cet événement est appelé.
P粉6595169062023-08-19 00:25:11
D'accord, considérons la MySQL
structure de table suivante :
CREATE TABLE Devices ( device_id INT PRIMARY KEY, status ENUM('ACTIVE', 'EXPIRED') ); CREATE TABLE Drivers ( driver_id INT PRIMARY KEY, device_id INT, expiration_date DATE, FOREIGN KEY (device_id) REFERENCES Devices(device_id) );
Vous devez parcourir chaque pilote pour voir s'il est obsolète et mettre à jour l'appareil correctement.
Tout d'abord, vous devez activer EVENTS
dans la base de données :
SET GLOBAL event_scheduler = ON;
Ensuite, vous pouvez créer un pilote event
,检查所有 active
设备的 expired
qui s'exécute quotidiennement et le mettre à jour de manière appropriée :
DELIMITER // CREATE EVENT UpdateDeviceStatus ON SCHEDULE EVERY 1 DAY STARTS CURRENT_DATE DO BEGIN UPDATE Devices d SET d.status = 'EXPIRED' WHERE EXISTS ( SELECT 1 FROM Drivers dr WHERE dr.device_id = d.device_id AND dr.expiration_date < CURRENT_DATE ) AND d.status = 'ACTIVE'; END; // DELIMITER ;