【问题标题】:Can we write multiple queries in a MySQL event?我们可以在 MySQL 事件中编写多个查询吗?
【发布时间】:2016-02-29 03:38:48
【问题描述】:

我想在 Mysql 事件的帮助下执行以下查询但是当我在事件中添加删除语句并尝试创建它时,给了我 Mysql 错误。如果我选择跳过删除语句,则事件将毫无问题地创建。

INSERT INTO tbl_bookings_released
(
    id, row, seatnum, price,theatre_id, play_id, show_id, showtime, show_date, 
    isbooked, inserted_at, inserted_from, booking_num, tot_price, subzone_id, 
    zone_id, txn_id
)
SELECT 
    id, row, seatnum, price,theatre_id, play_id, show_id, showtime, 
    show_date, isbooked, inserted_at, inserted_from, booking_num, 
    tot_price, subzone_id, zone_id, txn_id
FROM tbl_bookings
WHERE (
    UNIX_TIMESTAMP( NOW( ) ) - UNIX_TIMESTAMP( inserted_at )
) /60 > 2
AND booking_num NOT
IN (
    SELECT booking_id
    FROM tbl_cust_booking
);

DELETE
FROM tbl_bookings
WHERE (
    UNIX_TIMESTAMP( NOW( ) ) - UNIX_TIMESTAMP( inserted_at )
) /60 > 2
AND booking_num NOT
IN (
    SELECT booking_id
    FROM tbl_cust_booking
);

【问题讨论】:

    标签: mysql mysql-event


    【解决方案1】:

    这是一个从 documentation 修改的示例,它为一个事件执行多个查询:

    delimiter |
    
    CREATE EVENT e_daily
        ON SCHEDULE
          EVERY 1 DAY
        COMMENT 'Saves total number of sessions then clears the table each day'
        DO
          BEGIN
        INSERT INTO tbl_bookings_released
        (
            id, row, seatnum, price,theatre_id, play_id, show_id, showtime, show_date, 
            isbooked, inserted_at, inserted_from, booking_num, tot_price, subzone_id, 
            zone_id, txn_id
        )
        SELECT 
            id, row, seatnum, price,theatre_id, play_id, show_id, showtime, 
            show_date, isbooked, inserted_at, inserted_from, booking_num, 
            tot_price, subzone_id, zone_id, txn_id
        FROM tbl_bookings
        WHERE (
            UNIX_TIMESTAMP( NOW( ) ) - UNIX_TIMESTAMP( inserted_at )
        ) /60 > 2
        AND booking_num NOT
        IN (
            SELECT booking_id
            FROM tbl_cust_booking
        );
    
        DELETE
        FROM tbl_bookings
        WHERE (
            UNIX_TIMESTAMP( NOW( ) ) - UNIX_TIMESTAMP( inserted_at )
        ) /60 > 2
        AND booking_num NOT
        IN (
            SELECT booking_id
            FROM tbl_cust_booking
        );
    
    
          END |
    
    delimiter ;
    

    【讨论】:

    • 谢谢,它成功了。我正在使用 phpmyadmin 创建事件,并且在定义文本区域中,我刚刚编写了没有 BEGIN 和 END 标记的所需查询,我想这就是问题所在。我编辑了我现有的事件以添加 BEGIN 和 END,它起作用了!
    • 如果插入失败,是否会执行删除?
    【解决方案2】:

    如果您使用 phpmyadmin 创建事件,则在 BEGIN 和 END 标签内添加多个查询

    【讨论】:

    • 自我注意:似乎只适用于 BEGIN 之后和 END 之前的空行
    • 在 MariaDB (PHPMyAdmin) 中,BEGIN END 不起作用,即使我在 BEGIN 之后和 END 之前给出黑线
    • 这是我的代码:DELIMITER @@;创建事件 test_event_03 按计划每 1 分钟开始 CURRENT_TIMESTAMP 结束 CURRENT_TIMESTAMP + 间隔 72 小时开始更新 complete_exam_set SET live_status = '1' WHERE test_time
    【解决方案3】:
    DELIMITER @@;
    
    CREATE EVENT test_event_03
    ON SCHEDULE EVERY 1 MINUTE
    STARTS CURRENT_TIMESTAMP
    ENDS CURRENT_TIMESTAMP + INTERVAL 72 HOUR
    DO
    BEGIN
    
        UPDATE complete_exam_set 
       SET live_status = '1' 
       WHERE test_time < CURRENT_TIMESTAMP ;
    
       UPDATE complete_exam_set 
       SET live_status = '2' 
       WHERE end_time < CURRENT_TIMESTAMP ;
    
    END;
    @@;
    
    DELIMITER ; 
    

    为什么那个红十字会接近END 怎么了?

    【讨论】:

      猜你喜欢
      • 2021-04-20
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      • 2020-09-18
      • 2011-03-08
      • 1970-01-01
      • 2011-05-14
      相关资源
      最近更新 更多