Rumah  >  Soal Jawab  >  teks badan

MySQL menjalankan skrip automatik

<p>Saya mempunyai pangkalan data MySQL dengan dua jadual: pemacu dan peranti</p> <p>Jadual pemacu mempunyai medan yang dipanggil tarikh tamat tempoh. Jadual peranti mempunyai medan yang dipanggil status. </p> <p>Matlamat saya ialah untuk mencipta acara yang akan: </p> <ul> <li>Dapatkan tarikh semasa</li> <li>Bandingkan pemandu (tarikh tamat tempoh) dengan tarikh semasa</li> <li>Jika tarikh tamat tempoh telah berlalu, anda perlu menukar status peranti kepada 'EXP'</li> </ul> <p>Adakah perkara sedemikian mungkin? Seperti cek tamat tempoh</p>
P粉821231319P粉821231319428 hari yang lalu417

membalas semua(2)saya akan balas

  • P粉831310404

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

    Ini adalah pertanyaan yang perlu dilaksanakan oleh acara anda:

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

    Bagi penciptaan acara, anda mempunyai beberapa pilihan, beberapa daripadanya disenaraikan di sini:

    Apa pun, anda mungkin mahu membungkus UPDATE anda dalam prosedur tersimpan, dan jika terdapat lebih banyak penulisan, anda juga mungkin mahu membungkus transaksi apabila acara ini dipanggil.

    balas
    0
  • P粉659516906

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

    Baiklah, pertimbangkan MySQL struktur jadual berikut:

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

    Anda perlu menyemak setiap pemandu untuk melihat sama ada ia sudah lapuk dan mengemas kini peranti dengan betul.

    Pertama, anda perlu mendayakan EVENTS dalam pangkalan data:

    SET GLOBAL event_scheduler = ON;

    Seterusnya, anda boleh mencipta event,检查所有 active 设备的 expired pemandu yang berjalan setiap hari dan mengemas kininya dengan sewajarnya:

    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 ;

    balas
    0
  • Batalbalas