起因
项目上需要用到定时任务去更新某些表的内容,所想着网上查一下,试着弄一下。开始很顺利,但等我按着步骤弄完后,等到保存事件时却发现老是报错,保存不上。
报错如下:
You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version
for the right syntax to use near 'STARTS CURRENT_TIMESTAMP
ON COMPLETION PRESERVE
DO call update_yhdz()' at line 4
我的事件定义如下:(这个事件是我用navicat premium 15的事件创建工具自动生成的,事件的意思就是从现在开始,每10秒钟执行一次update_yhdz这个函数)
CREATE EVENT `ibase3`.`U1`
ON SCHEDULE
EVERY '10'
STARTS CURRENT_TIMESTAMP
ON COMPLETION PRESERVE
DO call update_yhdz();
一、排查过程
一开始,我不知道究竟错在哪里,于是稍微改了一下创建模式,从每10秒一次,变成某个固定时间执行,且执行一次
CREATE EVENT `ibase3`.`U1`
ON SCHEDULE
AT ‘2023-09-20 18:00:00’
ON COMPLETION PRESERVE
DO call update_yhdz();
意思为在2023年九月二十号下午6点执行一次。这次保存没问题。
但很快发现另一个问题:我任务是下午5点58分设定的,可是到了6点,居然不执行了。
排查了一大圈,都没发现什么问题,于是想着是不是自己设置的时间字符串有问题,于是又将时间改回了CURRENT_TIMESTAMP,这回是系统定义的字符串,准没问题了吧。
跟预想的一样,事件能成功执行,但我瞟了一眼时间,差点没把自己气晕!系统时间显示是早上10点多!因为mysql在另一个服务器上,我只是在本机远程访问,忽略了两边机器时间不同步!
二、最后发现问题
但是前面说的设定定时任务的保存还是没解决,于是我又仔细对比了一下网上的某个帖子:https://blog.csdn.net/qq_39390545/article/details/109851072
别人的语句:
CREATE EVENT demo_event4
ON SCHEDULE
EVERY 10 MINUTE
STARTS '2020-11-20 12:00:00'
ON COMPLETION PRESERVE
DO INSERT INTO `demo_1119` (`id`, `name`, `createTime`) VALUES (null, '陈哈哈', NOW())
我的语句(navicat premium 15生成):
CREATE EVENT `ibase3`.`U1`
ON SCHEDULE
EVERY '10'
STARTS CURRENT_TIMESTAMP
ON COMPLETION PRESERVE
DO call update_yhdz();
很明显,别人的“every 10” 后面是带单位的,而我的没有单位。
由于navicat 15的事件创建器中的sql预览不能改它自动生成的代码,所以我复制了出来,在查询窗口中加上“SECOND”以后,如果所想的一样,事件可以成功创建,同时也按我设定一样,每10秒执行了一次我给定的函数。
结论:是navicat premium 15的事件创建器的BUG,它自动生成的创建事件代码有语法问题,导致事件创建时报语法错误。
知道这个情况后,我真的哇的一声哭出来了,搞了一个多小时呢。