【问题标题】:Error with MySQL syntax in event sql-script. Delimeter already used事件 sql-script 中的 MySQL 语法错误。已使用分隔符
【发布时间】:2020-04-30 07:59:17
【问题描述】:

我有这个脚本用于每月更新表:

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 ;

此代码丢弃异常:

原因:java.sql.SQLSyntaxErrorException:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在“DELIMITER | ”附近使用正确的语法。 CREATE EVENT kpiparams_scheduled_update ON SCHEDULE EVERY 1 MONTH ST' 在第 1 行

还有这个:

嵌套异常是 java.sql.SQLSyntaxErrorException:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在“DELIMITER | ”附近使用正确的语法。 CREATE EVENT kpiparams_scheduled_update ON SCHEDULE EVERY 1 MONTH ' 在第 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

【问题讨论】:

  • 是井号(# 04:00:00 ...)被mysql识别为注释符号吗?
  • @Ronald,已删除,但没有帮助。
  • 您尝试过什么调试?在某些东西起作用之前,不应该很容易地在这里和那里移除零件吗?

标签: mysql sql sql-scripts mysql-event


【解决方案1】:

我猜你尝试使用 JDBC 运行它?

你根本不需要DELIMITER |。那是mysql client builtin command。 SQL 解析器无法识别客户端内置函数。

您可以将CREATE EVENT 语句作为单个语句执行,然后您不需要在语句末尾添加分隔符。分隔符仅在支持多条语句的接口(例如 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

(默认);

SQL 初始化脚本中的语句分隔符。

【讨论】:

  • 以上内容是从我在 2013 年发布的答案中转述的:stackoverflow.com/a/19772738/20860
  • 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 '' at line 1
  • 我无法推断您是如何称呼它的。但是我在 mysql 客户端中测试了你的 CREATE EVENT 并没有出错。
  • 通常,当您收到抱怨'' 的语法错误时,这意味着解析器已到达您的SQL 语句的末尾并期望更多。就像一个右括号,或者一个结尾的 END 或类似的东西。
  • 我在回答我如何调用这个 sql 脚本时添加了一行。我无法理解它到底期望什么......
猜你喜欢
  • 2012-02-19
  • 1970-01-01
  • 2010-11-22
  • 2017-12-19
  • 1970-01-01
  • 2010-11-19
  • 2011-11-23
  • 2013-02-04
  • 1970-01-01
相关资源
最近更新 更多