2

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

我有两个表,“test”和“test_watcher”:在触发器的帮助下,对第一个表的更改记录在 watcher 表中。最后一个触发器需要在 上执行 2 次操作DELETE,它可以在 MySQL Workbench (with 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

我知道它可以DELIMITER $$在 Workbench 中使用,但 JDBC 不支持它。

我已经在 PostgreSQL 中实现了它,并会在必要时发布代码。

4

2 回答 2

2

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

于 2013-01-31T10:21:32.193 回答
2

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

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

(这个答案是基于我上面的评论)

于 2013-01-31T12:31:45.873 回答