我和我的团队需要一个简单的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}}”附近使用的正确语法
谁能告诉我我做错了什么?
1条答案
按热度按时间yhived7q1#
语法是操作在表之前命名。
在MySQL中必须使用
FOR EACH ROW
,而不是AS
。如果使用像
IF
这样的复合语句,则必须将触发器的主体放在BEGIN...END
块中。不正确:
正确:
另外,
{{db_name}}
标识符也是无效的,除非你对它进行了分隔。我假设在你的例子中,它只是匿名的,或者它是模板的一部分。你尝试的语法让我觉得你已经习惯了Microsoft SQL Server的触发器语法。你应该研究MySQL的语法文档,因为它与Microsoft不同。
例如,在MySQL中使用
OLD.<column>
和NEW.<column>
,而不是deleted
和inserted
,而且SET NOCOUNT ON
也不是MySQL方言的一部分。https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html