【问题标题】:Mysql trigger statement keeps giving syntax errorMysql触发语句一直报语法错误
【发布时间】:2021-12-20 05:39:03
【问题描述】:

当我尝试在 phpmyadmin 中执行此语句时,我不断收到错误消息。我正在运行 mysql 5.7

DELIMITER //
CREATE OR REPLACE TRIGGER update_counts_trigger AFTER INSERT OR UPDATE OR DELETE ON tickets
FOR EACH ROW
BEGIN
    DECLARE V_uitvoeringId, V_ReserveringId varchar(50);
    DECLARE V_tekoop, V_gereserveerd, V_wachtlijst int;
    
    SET V_ReserveringId = NEW.reserveringId OR OLD.reserveringId;
    SET V_uitvoeringId = ( SELECT uitvoeringId FROM reservering WHERE id=V_ReserveringId )
    SET V_tekoop = (
        SELECT count(*) 
        FROM tickets t 
        WHERE t.tekoop AND NOT t.geannuleerd AND NOT t.verkocht AND t.uitvoeringId = V_uitvoeringId);

    SET V_gereserveerd =  (
        SELECT count(*) 
        FROM tickets t 
        WHERE NOT t.wachtlijst AND NOT t.geannuleerd AND NOT t.verkocht AND t.uitvoeringId = V_uitvoeringId);

    SET V_wachtlijst = (
        SELECT count(*) FROM tickets t WHERE t.wachtlijst AND NOT t.geannuleerd AND NOT t.verkocht AND t.uitvoeringId = V_uitvoeringId);

    update uitvoering 
        set tekoop = V_tekoop,       
            gereserveerd =  V_gereserveerd, 
            wachtlijst =  V_wachtlijst,
            vrije_plaatsen = aantal_plaatsen - V_gereserveerd + V_tekoop  
        WHERE id=V_uitvoeringId; 
END //
DELIMITER ;

谁能看出问题所在?

  • 无法识别的语句类型。 (靠近位置 176 的“DECLARE”)
  • 这种类型的子句以前已解析过。 (靠近位置 398 的“SET”)
  • 无法识别的语句类型。 (靠近位置 1192 的“END”)

【问题讨论】:

    标签: mysql phpmyadmin


    【解决方案1】:

    还有其他语法错误导致这些投诉。

    1. 在 MySQL 中没有带触发器的 OR REPLACE 选项。触发器必须被删除然后重新创建。
    2. 没有带有动作的ORing,只有一个,这意味着即使定义可能相同,您也必须创建 3 个触发器。但是,您似乎只需要一个AFTER UPDATE 操作? ...因为AFTER INSERT 没有OLD 引用,而AFTER DELETE 没有NEW 引用。
    3. 通过这两项,在使用SELECT uitvoeringId 查询后还缺少;

    把所有这些放在一起,就变成了:

    DELIMITER //
    CREATE TRIGGER update_counts_trigger AFTER UPDATE ON tickets
    FOR EACH ROW
    BEGIN
        DECLARE V_uitvoeringId, V_ReserveringId varchar(50);
        DECLARE V_tekoop, V_gereserveerd, V_wachtlijst int;
        
        SET V_ReserveringId = NEW.reserveringId OR OLD.reserveringId;
        SET V_uitvoeringId = ( SELECT uitvoeringId FROM reservering WHERE id=V_ReserveringId );
        SET V_tekoop = (
            SELECT count(*) 
            FROM tickets t 
            WHERE t.tekoop AND NOT t.geannuleerd AND NOT t.verkocht AND t.uitvoeringId = V_uitvoeringId);
    
        SET V_gereserveerd =  (
            SELECT count(*) 
            FROM tickets t 
            WHERE NOT t.wachtlijst AND NOT t.geannuleerd AND NOT t.verkocht AND t.uitvoeringId = V_uitvoeringId);
    
        SET V_wachtlijst = (
            SELECT count(*) FROM tickets t WHERE t.wachtlijst AND NOT t.geannuleerd AND NOT t.verkocht AND t.uitvoeringId = V_uitvoeringId);
    
        update uitvoering 
            set tekoop = V_tekoop,       
                gereserveerd =  V_gereserveerd, 
                wachtlijst =  V_wachtlijst,
                vrije_plaatsen = aantal_plaatsen - V_gereserveerd + V_tekoop  
            WHERE id=V_uitvoeringId; 
    END //
    DELIMITER ;
    

    然后在 phpMyAdmin 中使用:

    那么在执行完SQL之后:

    然后检查触发器选项卡:

    ...在触发器处单击Edit 会显示定义:

    【讨论】:

    • 谢谢!我已经从我使用的 Postgres SP 中复制/修改了代码,但显然语法上有很多差异
    猜你喜欢
    • 2013-01-18
    • 2013-05-28
    • 1970-01-01
    • 2014-07-21
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    相关资源
    最近更新 更多