搜索

首页  >  问答  >  正文

MySQL运行自动脚本

<p>我有一个MySQL数据库,其中有两个表:drivers和devices</p> <p>drivers表有一个字段叫做expiration date。 devices表有一个字段叫做status。</p> <p>我的目标是创建一个事件,它将:</p> <ul> <li>获取当前日期</li> <li>将drivers(expiration date)与当前日期进行比较</li> <li>如果过期日期已过,则需要将设备的状态更改为'EXP'</li> </ul> <p>这样的事情可能吗? 就像一个过期检查</p>
P粉821231319P粉821231319553 天前520

全部回复(2)我来回复

  • P粉831310404

    P粉8313104042023-08-19 00:37:07

    这是您的事件需要执行的查询:

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

    至于事件的创建,您有多种选择,其中一些列在这里:

    无论如何,您可能希望将您的 UPDATE 包装在一个 存储过程 中,而且如果有更多的写操作,您可能还希望在调用此事件时包装一个 事务

    回复
    0
  • P粉659516906

    P粉6595169062023-08-19 00:25:11

    好的,考虑以下 MySQL 表结构:

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

    您需要遍历每个驱动程序,查看是否已过期并正确更新设备。

    首先,您需要在数据库中启用 EVENTS

    SET GLOBAL event_scheduler = ON;

    接下来,您可以创建一个每天运行的 event,检查所有 active 设备的 expired 驱动程序并进行适当的更新:

    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 ;

    回复
    0
  • 取消回复