使用更新 table 的 IF 条件创建触发器的正确​​语法是什么?

What's the correct syntax to create a trigger with an IF condition that updates a table?

我的 CREATE TRIGGER MySQL 总是出现语法错误,尽管在这些线程的答案中遵循了类似的语法:

211853

5372872

但我得到:

1064 - 您的 SQL 语法有误;查看与您的 MariaDB 服务器版本对应的手册,了解在第 11 行

附近使用的正确语法

我使用 XAMPP,目前我正在尝试 运行 PHPMyAdmin 中的此代码,以确保它在添加到 PHP 中的 PDO 查询之前有效...

                CREATE TRIGGER before_mediaitems_update
                BEFORE UPDATE 
                ON mediaitems
                FOR EACH ROW 
                BEGIN
                    IF (NEW.ConsumptionStatus != OLD.ConsumptionStatus) 
                    THEN
                        update UpdateLog_ConsumptionStatus
                        set MediaItemID = OLD.MediaItemID,
                        UpdateValue = NEW.ConsumptionStatus,
                        DateUpdated = NOW();
                    END IF;
                END

在创建此触发器之前,我已经 运行 并成功创建了从属 table,因此脚本的这一部分有效。在在线 MySQL 语法检查器中,他们不喜欢这种语法,但会提供与 #1064 一样有用的错误消息。

任何时候mediaitems table中的记录改变了它的ConsumptionStatus,我想在UpdateLog_ConsumptionStatus table中记录:mediaitem的PK作为[=中的FK 30=]>MediaItemID,然后是新的 ConsumptionStatus 值,最后是更新发生的日期时间。

您的代码看起来不错。编译错误指向 update 语句的末尾,即由 ; 终止的语句。

我怀疑你只需要设置一个 DELIMITER 而不是 ;:

DELIMITER //  -- set the delimiter

CREATE TRIGGER before_mediaitems_update
BEFORE UPDATE ON mediaitems
FOR EACH ROW 
BEGIN
    IF NEW.ConsumptionStatus != OLD.ConsumptionStatus
    THEN
        update UpdateLog_ConsumptionStatus
        set MediaItemID = OLD.MediaItemID, UpdateValue = NEW.ConsumptionStatus, DateUpdated = NOW();
    END IF;
END
//

DELIMITER ;  -- reset the delimiter

Demo on DB Fiddle

注意:大概,您想要一个 INSERT 而不是 UPDATE - 或者,至少 UPDATE 应该有一个 WHERE 子句(否则它会更新table).

中的所有行