尝试解决 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 使用 PhpMyAdmin 触发插入语法错误