我在php中创建一个房间预订。
我有两张桌子:
表RESERVE
表ROOM
当“结帐”日期到达今天的日期时,保留表中的该行将被删除。实际上我已经有了该事件:
DROP EVENT `auto_delete_chckout`;
CREATE DEFINER=`root`@`localhost`
EVENT `auto_delete_chckout`
ON SCHEDULE EVERY 1 MINUTE STARTS '2013-01-26 13:09:15'
ON COMPLETION NOT PRESERVE ENABLE DO
DELETE FROM reserve WHERE checkout <= CURDATE()
所以我的问题是:
如果预订被删除,则必须在房间表的room_reserve_qty
中添加room_qty
。
答案 0 :(得分:1)
在删除表reserve
上的记录之前,您需要先更新表room
的记录,以便了解哪些room_id
将更新,例如
UPDATE room a
INNER JOIN reserve b
ON a.room_id = b.room_id
SET a.room_qty = a.room_qty + b.room_reserve_qty
WHERE b.checkout <= CURDATE();
DELETE FROM reserve WHERE checkout <= CURDATE();
完整代码:
DROP EVENT `auto_delete_chckout`;
DELIMITER $$
CREATE EVENT `auto_delete_chckout`
ON SCHEDULE EVERY 1 MINUTE STARTS '2013-01-26 13:09:15'
ON COMPLETION NOT PRESERVE ENABLE
DO
BEGIN
UPDATE room a
INNER JOIN reserve b
ON a.room_id = b.room_id
SET a.room_qty = a.room_qty + b.room_reserve_qty
WHERE b.checkout <= CURDATE();
DELETE FROM reserve WHERE checkout <= CURDATE();
END $$
DELIMITER ;
<击> 撞击>
<击><强>更新强>
由于您提到您是新用户,Event
,我认为,导致服务器上的大量工作。 TRIGGER
可能是另一种方式。 Trigger
基本上是每次在表上发生事件(之前或之后)时触发的代码块,例如:INSERT
,UPDATE
和DELETE
。
<击> 撞击>
答案 1 :(得分:0)
首先,您可能不需要每分钟触发一次事件,因为您只检查日期部分。你可能想每天做一次。
其次,我会将room_qty
逻辑更新为trigger。这样,无论您如何删除预订,room_qty
都是正确的。
您的触发器可能如下所示
DELIMITER $$
CREATE TRIGGER reserve_before_delete BEFORE DELETE ON reserve
FOR EACH ROW BEGIN
UPDATE room
SET room_qty = room_qty + OLD.room_reserve_qty
WHERE room_id = OLD.room_id;
END;
$$
DELIMITER ;
使用触发器时,DELETE
代码保持不变。