Maison  >  Questions et réponses  >  le corps du texte

MySQL exécute des scripts automatisés

<p>J'ai une base de données MySQL avec deux tables : pilotes et périphériques</p> <p>La table des pilotes comporte un champ appelé date d'expiration. La table des appareils comporte un champ appelé statut. </p> <p>Mon objectif est de créer un événement qui : </p> <ul> <li>Obtenir la date actuelle</li> <li>Comparez les pilotes (date d'expiration) avec la date actuelle</li> <li>Si la date d'expiration est dépassée, vous devez modifier l'état de l'appareil en « EXP »</li> </ul> <p>Une telle chose est-elle possible ? Comme un contrôle d'expiration</p>
P粉821231319P粉821231319428 Il y a quelques jours416

répondre à tous(2)je répondrai

  • P粉831310404

    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é.

    répondre
    0
  • P粉659516906

    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 ;

    répondre
    0
  • Annulerrépondre