mysql 更新触发器的SQL语法不正确

bxpogfeg  于 2023-03-22  发布在  Mysql
关注(0)|答案(1)|浏览(129)

我和我的团队需要一个简单的sql触发器来更新表中的一列(column 2),当另一列(column 1)被更新时。这两列都在同一个表中,这个触发器将在我们的AWS RDS中运行。
下面是我的代码:

CREATE TRIGGER recalc_trigger ON {{db_name}}.{{table_name}}
AFTER UPDATE
AS
IF UPDATE({{column2}})
BEGIN
    SET NOCOUNT ON;
    UPDATE {{db_name}}.{{table_name}}
      SET {{column1}} = (deleted.{{column1}}/(1 + deleted.{{column2}})) * (1 + inserted.{{column2}})
      WHERE {{table_primary_key}} = inserted.{{table_primary_key}};
END

从我在网上看到的所有例子来看,这应该可以工作,但我得到了这个错误:

SQL错误[1064] [42000]:SQL语法中有错误;查看与您的MySQL服务器版本对应的手册,以了解在第1行“ON {{db_name}}.{{table_name}} AFTER UPDATE AS IF UPDATE({{column 2}}”附近使用的正确语法

谁能告诉我我做错了什么?

yhived7q

yhived7q1#

语法是操作在表之前命名。
在MySQL中必须使用FOR EACH ROW,而不是AS
如果使用像IF这样的复合语句,则必须将触发器的主体放在BEGIN...END块中。
不正确:

CREATE TRIGGER recalc_trigger ON {{db_name}}.{{table_name}}
AFTER UPDATE
AS 
IF ...

正确:

CREATE TRIGGER recalc_trigger 
AFTER UPDATE
ON {{db_name}}.{{table_name}}
FOR EACH ROW
BEGIN
  IF ...
END

另外,{{db_name}}标识符也是无效的,除非你对它进行了分隔。我假设在你的例子中,它只是匿名的,或者它是模板的一部分。
你尝试的语法让我觉得你已经习惯了Microsoft SQL Server的触发器语法。你应该研究MySQL的语法文档,因为它与Microsoft不同。
例如,在MySQL中使用OLD.<column>NEW.<column>,而不是deletedinserted,而且SET NOCOUNT ON也不是MySQL方言的一部分。
https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html

相关问题