mysql - 事件 sql 脚本中的 MySQL 语法错误。已使用 Delimeter

标签 mysql sql sql-scripts mysql-event

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

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/

相关文章:

sql - 如何优化这个 "Time apart"SQL 查询?

unit-testing - 如何使用hibernate执行sql脚本文件?

php - 无法从数据库中获取数据并在 css 和 html 中打印

SQL,OrderBy/GroupBy 问题

php - 重复 key 更新不起作用

sql - 如何从一个表和一个子表中进行选择

sql - 如何创建sql脚本来转储sql server表数据?

mysql - 在 MySQL 命令行中执行 .sql 脚本的正确语法是什么?

mysql - SQLzoo JOIN 教程 #13

php - <选择> 和 $_POST