MySQL Workbench正常的Update Query在Java代码中执行报错
解决Java中执行MySQL JOIN式UPDATE语句报错的问题
嘿,我之前也踩过这个坑!你的这条UPDATE语句在MySQL Workbench里能正常运行,但Java里抛出expecting "set", found 'INNER'错误,本质原因是JDBC驱动或你使用的SQL执行框架(比如MyBatis、JPA)不兼容MySQL这种JOIN式UPDATE的扩展语法——MySQL本身支持这种写法,但很多Java端的SQL解析工具只认ANSI标准的UPDATE格式。
下面是几个可行的解决办法:
改用标准UPDATE+子查询写法(最稳妥)
把语句改成MySQL支持的标准格式,这种写法几乎所有JDBC驱动都能正确解析:UPDATE table1 t1 SET t1.fromUserId=305, t1.toUserId=306, t1.type='Positive', t1.subcategoryId=508, t1.isDeleted=false, t1.isNotify=true WHERE t1.id = 1 AND t1.time = (SELECT MAX(time) FROM table1 WHERE id = 1);这里额外加上
t1.id = 1是为了精准定位目标行,避免其他id的行被误更新(毕竟不同id下可能存在相同的MAX(time)值)。升级MySQL JDBC驱动版本
如果你坚持要用JOIN式的写法,可以尝试升级你的MySQL JDBC驱动到最新版本(比如mysql-connector-java 8.0.x及以上)。旧版本驱动对MySQL的扩展语法兼容性较差,升级后大概率能解决解析错误。检查ORM框架的SQL校验规则
如果你是通过ORM框架(比如MyBatis)执行SQL,要确认框架有没有开启严格的语法校验。有些框架的内置解析器只支持ANSI标准SQL,会把MySQL的JOIN UPDATE判定为非法语法,这时候你需要关闭框架的语法校验,或者改用框架支持的写法。
内容的提问来源于stack exchange,提问作者Deepak Kumbhar
相关产品推荐
相关产品推荐

