在一个事件调度程序中更新和删除

时间:2013-01-27 04:59:57

标签: mysql sql sql-update sql-delete

我在php中创建一个房间预订。

我有两张桌子:

RESERVE

  • reserve_id
  • ROOM_ID
  • room_reserve_qty
  • 结帐

ROOM

  • ROOM_ID
  • room_qty

当“结帐”日期到达今天的日期时,保留表中的该行将被删除。实际上我已经有了该事件:

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

2 个答案:

答案 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基本上是每次在表上发生事件(之前或之后)时触发的代码块,例如:INSERTUPDATEDELETE

<击>

答案 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代码保持不变。