尝试解决 MYSQL 更新触发器的语法错误

Posted

技术标签:

【中文标题】尝试解决 MYSQL 更新触发器的语法错误【英文标题】:Trying to resolve a syntax error for MYSQL update trigger 【发布时间】:2021-02-13 04:55:05 【问题描述】:

我正在尝试创建一个触发器以在更新 Assign 表时更新 Project 表,但我一直收到此错误:You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'END IF

有人知道我为什么会收到这个语法错误吗?请注意,我是这方面的初学者,所以我的 SQL 语句可能完全错误。另外,我确信在我的 IF 语句中运行的查询是有效的,因为我是在没有在触发器内的情况下自行运行的。

delimiter $$

CREATE TRIGGER update_trigger AFTER UPDATE ON Assign
FOR EACH ROW
  BEGIN
    IF OLD.projNo <> new.projNo THEN
    
    #RUN THIS QUERY TO UPDATE MY TABLE

    
        UPDATE Project p JOIN 
          (SELECT Project.projNo, COUNT(DISTINCT empid) as numEmployeeAssigned
            FROM (Project LEFT JOIN Assign ON Project.projNo=Assign.projNo) 
            GROUP BY projNo
            ) as tb 
            ON p.projNo = tb.projNo
            SET p.numEmployeeAssigned = tb.numEmployeeAssigned
            
     #END QUERY
     
    END IF
  END$$
delimiter;

【问题讨论】:

在 UPDATE 语句的末尾需要一个分号。 @BillKarwin 每当我在 UPDATE 末尾添加分号时,语法错误都没有得到解决 - 不过感谢您的帮助。 【参考方案1】:

很明显,您的代码在UPDATE 语句和END IF 之后缺少分号。

但是,我建议UPDATE 语句很可能会被简化。据我了解您的代码,您希望在员工更改其分配时更新Project 中的员工人数。如果是这样,则无需实际查询assign。你可以像这样使用条件逻辑:

CREATE TRIGGER update_trigger AFTER UPDATE ON Assign
FOR EACH ROW
BEGIN
    IF OLD.projNo <> new.projNo THEN
        UPDATE Project p
        SET numEmployeeAssigned = CASE 
            WHEN projNo =  new.projNo THEN numEmployeeAssigned + 1
            ELSE numEmployeeAssigned - 1
        END
        WHERE projNo IN (OLD.projNo, NEW.projNo);
    END IF;
END$$

您甚至可以删除 IF 语句并将该条件直接放入查询中:

CREATE TRIGGER update_trigger AFTER UPDATE ON Assign
FOR EACH ROW
BEGIN
    UPDATE Project p
    SET numEmployeeAssigned = CASE 
        WHEN projNo =  new.projNo THEN numEmployeeAssigned + 1
        ELSE numEmployeeAssigned - 1
    END
    WHERE projNo IN (OLD.projNo, NEW.projNo) AND OLD.projNo <> NEW.projNo
END$$

【讨论】:

感谢您,这非常有效!你能解释一下你的第一个代码-sn-p 第 10 行的逻辑吗:“...WHERE projNo IN (OLD.projNo, NEW.projNo);” @emonz:想法是选择与触发更新语句相关的项目。从旧项目中撤出 1,在新项目中添加 1。 ` projNo IN (OLD.projNo, NEW.projNo)` 等价于projNo = OLD.projNo OR projNo = NEW.projNo【参考方案2】:

您可以增加或减少计数:

   UPDATE Project p
        SET p.numEmployeeAssigned = p.numEmployeeAssigned +
                                    (case when p.projNo = new.ProjNo then 1 else -1 end)
        WHERE p.projNo IN (old.ProjNo, new.ProjNo) AND
              old.ProjNo <> new.ProjNo;

【讨论】:

以上是关于尝试解决 MYSQL 更新触发器的语法错误的主要内容,如果未能解决你的问题,请参考以下文章

如果存在 MySQL 触发器语法错误

更新前的 MySQL 使用 PhpMyAdmin 触发插入语法错误

当我尝试在 mysql 中创建触发器时出现语法错误

尝试编写 MySQL 触发器以替换 phpmyadmin 上的 CHECK 约束时出现语法错误

phpmyadmin mysql 触发语法错误

空字符串无法解释的MySQL错误#1064创建更新触发器后?