我有这个每月更新表的脚本:
DELIMITER |
CREATE
EVENT `kpiparams_scheduled_update`
ON SCHEDULE
EVERY 1 MONTH
STARTS '2020-02-01 02:59:59'
ON COMPLETION PRESERVE
COMMENT 'KPIParams was updated by event_kpiparams_scheduled_update'
DO
BEGIN
UPDATE kpiparams INNER JOIN kpiparams_update
ON kpiparams.param_name = kpiparams_update.param_name
SET kpiparams.good = kpiparams_update.good,
kpiparams.bad = kpiparams_update.bad,
kpiparams.weight_gold = kpiparams_update.weight_gold,
kpiparams.weight_tech = kpiparams_update.weight_tech,
kpiparams.is_for_calc = kpiparams_update.is_for_calc
WHERE kpiparams.param_name = kpiparams_update.param_name;
END |
DELIMITER ;
此代码丢弃异常:
Caused by: java.sql.SQLSyntaxErrorException: 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 'DELIMITER | CREATE EVENT kpiparams_scheduled_update ON SCHEDULE EVERY 1 MONTH ST' at line 1
还有这个:
nested exception is java.sql.SQLSyntaxErrorException: 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 'DELIMITER | CREATE EVENT
kpiparams_scheduled_update
ON SCHEDULE EVERY 1 MONTH ' at line 1
我搜索了一些资源,说我需要使用 Delimeter,不要在 '' 中写入月份数量并使用 BEGIN-END。顺便说一下,这对我没有帮助。
spring.datasource.schema=classpath*:mysql-scripts/event_update_kpiparams.sql
编辑脚本:
CREATE
EVENT kpiparams_scheduled_update
ON SCHEDULE EVERY 1 MONTH STARTS '2020-02-01 02:59:59'
ON COMPLETION PRESERVE
COMMENT 'KPIParams was updated by event_kpiparams_scheduled_update'
DO
BEGIN
UPDATE kpiparams INNER JOIN kpiparams_update
ON kpiparams.param_name = kpiparams_update.param_name
SET kpiparams.good = kpiparams_update.good,
kpiparams.bad = kpiparams_update.bad,
kpiparams.weight_gold = kpiparams_update.weight_gold,
kpiparams.weight_tech = kpiparams_update.weight_tech,
kpiparams.is_for_calc = kpiparams_update.is_for_calc
WHERE kpiparams.param_name = kpiparams_update.param_name;
END
最佳答案
我猜您尝试使用 JDBC 来运行它?
您根本不需要DELIMITER |
。那是mysql client builtin command 。 SQL 解析器无法识别客户端内置函数。
您可以将 CREATE EVENT
语句作为单个语句执行,然后不需要在语句末尾添加分隔符。分隔符仅在支持多个语句的接口(interface)(例如 mysql 客户端)中才重要。
好吧,看来您正在 .sql
文件中使用多个语句,并且您需要某种方法来分隔这些语句。通常这是 ;
但有些语句包含 ;
作为语句的一部分,而不是作为分隔符。
我不是 Spring 开发人员,但我发现 Spring Boot Database initialization MySQLException for Trigger其中描述了以下内容的使用:
spring.datasource.separator
这也被记录在案:https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html
spring.datasource.separator
(default)
;
Statement separator in SQL initialization scripts.
关于mysql - 事件 sql 脚本中的 MySQL 语法错误。已使用 Delimeter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59719441/