首頁  >  問答  >  主體

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粉821231319428 天前419

全部回覆(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
  • 取消回覆