MySQL menjalankan skrip automatik
P粉821231319
P粉821231319 2023-08-18 11:24:32
0
2
477
<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粉821231319
P粉821231319

membalas semua(2)
P粉831310404

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.

P粉659516906

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 ;
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan