<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>
这是您的事件需要执行的查询:
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包装在一个 存储过程 中,而且如果有更多的写操作,您可能还希望在调用此事件时包装一个 事务。好的,考虑以下
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:接下来,您可以创建一个每天运行的
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 ;