使用更新 table 的 IF 条件创建触发器的正确语法是什么?
What's the correct syntax to create a trigger with an IF condition that updates a table?
我的 CREATE TRIGGER MySQL 总是出现语法错误,尽管在这些线程的答案中遵循了类似的语法:
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
注意:大概,您想要一个 INSERT
而不是 UPDATE
- 或者,至少 UPDATE
应该有一个 WHERE
子句(否则它会更新table).
中的所有行
我的 CREATE TRIGGER MySQL 总是出现语法错误,尽管在这些线程的答案中遵循了类似的语法:
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
注意:大概,您想要一个 INSERT
而不是 UPDATE
- 或者,至少 UPDATE
应该有一个 WHERE
子句(否则它会更新table).