【问题标题】:Syntax exception on trigger with multiple statements with MySQL and JDBC使用 MySQL 和 JDBC 触发多个语句时的语法异常
【发布时间】:2013-01-15 09:42:58
【问题描述】:

我正在尝试使用 InnoDB 创建一个 在 MySQL 中执行多个操作的触发器 5.5.28。

我有两个表,“test”和“test_watcher”:在触发器的帮助下,对第一个表的更改记录在 watcher 表中。最后一个触发器需要在 DELETE 上执行 2 次操作,它可以在 MySQL Workbench(使用 DELIMITER)中工作,但如果我使用 JDBC 创建它就不行。

CREATE TRIGGER `AD_test_FER` AFTER DELETE
  ON `test`
  FOR EACH ROW
      BEGIN
        -- if it's been inserted, modified and deleted but never synced, 
        -- the revision is NULL: no one needs to know about it
        DELETE FROM test_watcher WHERE pk = OLD.id AND revision IS NULL;

        -- if it has been synced already, we just update the flag
        UPDATE test_watcher SET flag = -1 WHERE pk = OLD.id;
      END;

我不断收到com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax

我知道它适用于 Workbench 中的 DELIMITER $$,但 JDBC 不支持它。

我已经在 PostgreSQL 中实现了它,如果需要,我会发布代码。

【问题讨论】:

  • 你有没有机会使用connection propertyallowMultiQueries=true。这可能会搞砸事情,因为它可能只是在; 上分裂。
  • 很好,我没有意识到这一点。我检查了它,它似乎工作。感谢您指出这一点。

标签: mysql jdbc triggers innodb


【解决方案1】:

如果 JDBC 不支持分隔符(DELIMITER 是客户端命令),则分别执行这两条语句 - 一条一条。

【讨论】:

  • 这个我也想过,但是怎么办呢?它们在触发器内部,应该同时执行。
  • 不,我的意思是:删除触发器,然后创建触发器。
  • 好的,我更新了我的代码以避免 nmisunderstandings。请考虑触发器创建中的 DELETE 和 UPDATE 语句。
【解决方案2】:

此行为可能是由connection property allowMultiQueries=true 引起的。我的猜测是这个属性会使 MySQL 将 ; 上的查询分解为查询分隔符,然后将它们作为单独的查询执行,这实际上会破坏您的触发器创建代码。

正如您在 - 现在已删除 - 答案中所说的那样,添加 allowMultiQueries=true 实际上解决了问题(与我的预期相反),问题实际上可能是您查询中的最后一个 ;。所以要检查的另一件事是,通过删除脚本中的最后一个;(在END; 中)(而不是使用allowMultiQueries=true),问题是否会消失。一些数据库不认为; 在语句末尾有效(因为它实际上是分隔语句的分隔符)。

(此答案基于我上面的评论)

【讨论】:

  • 其实不是这个属性的问题,而是;的处理方式有问题。谢谢你的提示!
猜你喜欢
  • 2015-12-12
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 2020-09-22
  • 1970-01-01
  • 2011-11-26
  • 2017-04-12
  • 2021-12-20
相关资源
最近更新 更多