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

标签 mysql sql sql-update sql-delete

我正在用 php 创建房间预订。

我有两个表:

RESERVE

  • reserve_id
  • 房间号
  • 房间预订数量
  • 结帐

table ROOM

  • 房间号
  • 房间数量

当“checkout”日期到了今天,reserve 表中的那一行将被删除。实际上我已经有那个事件了:

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中。

最佳答案

在删除表 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 , UPDATEDELETE .

<罢工>

关于mysql - 在一个事件调度程序中更新和删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14544584/

相关文章:

php - Python 中的安全 MySQL 连接

MySQL,Concat int 并保存到变量并使用带有 'IN' 或 'NOT IN' 的变量

php - Mysql 查询更新行并使用相同的查询返回新值

java - sql语法如何在java中写下来

performance - Postgres函数优化

mysql用另一个表中的值更新列

php - 错误号 : 1048 Column 'btc' cannot be null

php - MySQL访问超时错误

sql - 比较值何时可以为 NULL 或文本

mysql - 如何将 PostgreSQL 数据库中的所有 SMALLINT 列转换为 BOOLEAN?