【问题标题】:Error when executing mvn sql:execute执行 mvn sql:execute 时出错
【发布时间】:2017-08-24 18:59:19
【问题描述】:

我希望 Maven 执行 sql 文件,它生成的数据库模式稍后将在我的程序中使用。但它不起作用,可能是由“DELIMITER”引起的。当我执行“mvn sql:execute”时,它会打印出来

[ERROR] Failed to execute:  DELIMITER $$

这是我的 pom.xml 的一部分

        <plugin>
            <groupId>org.codehaus.mojo</groupId>  
            <artifactId>sql-maven-plugin</artifactId>
            <version>1.5</version>
            <dependencies>
                <dependency>
                    <groupId>mysql</groupId>
                    <artifactId>mysql-connector-java</artifactId>
                    <version>5.1.21</version>
                </dependency>
            </dependencies>
            <executions>
                <execution>
                    <id>init-schema</id>
                    <goals>
                        <goal>site</goal>
                    </goals>
                    <phase>deploy</phase>
                </execution>
            </executions>
            <configuration>
                <driver>com.mysql.jdbc.Driver</driver>
                <username>root</username>
                <password>root</password>
                <url>jdbc:mysql://127.0.0.1:3306/?useUnicode=true&amp;characterEncoding=UTF-8</url>
                <autocommit>false</autocommit>
                <srcFiles>
                    <srcFile>src/main/sql/jellyjolly-schema.sql</srcFile>
                </srcFiles>
            </configuration>
        </plugin>

这是我的 sql 文件的一部分

DELIMITER $$

USE `jellyjolly_schema`$$
DROP TRIGGER IF EXISTS `jellyjolly_schema`.`delete_user` $$
USE `jellyjolly_schema`$$


CREATE TRIGGER delete_user
AFTER DELETE
ON jj_users
FOR EACH ROW
BEGIN
    ## delete the posts that belong to the user
    DELETE FROM jj_blog_posts WHERE author_user_id=OLD.user_id;
END
$$

是不是因为 Maven 调用的 MySQL Java 连接器不支持关键字“DELIMITER”。那我该如何解决呢?

【问题讨论】:

  • 你为什么要使用这么奇怪的分隔符。通常的分隔符是“;”。
  • @khmarbaise 如果我使用分隔符 ';', ';'不能出现在声明声明中。例如,'DELETE FROM jj_blog_posts WHERE author_user_id=OLD.user_id;'不能以';'结尾
  • 我同意可能有一个更优雅的解决方案。您可以查看this question 以获得灵感。

标签: java mysql maven


【解决方案1】:

在阅读了您的 cmets 之后,我认为最好的解决方案是 accepted here。也就是说,只使用一个分隔符(最好是默认分隔符;)并使用sql-maven-plugin 配置要求分隔符出现在它自己的行上才能真正成为分隔符。

&ltconfiguration&gt &ltdelimiterType&gtrow&lt/delimiterType&gt &lt/configuration&gt

(感谢@Zheka

您的触发器将如下所示:

CREATE TRIGGER delete_user
AFTER DELETE
ON jj_users
FOR EACH ROW
BEGIN
    ## delete the posts that belong to the user
    DELETE FROM jj_blog_posts WHERE author_user_id=OLD.user_id; # this delimiter is ignored
END
; # this delimiter is recognized

【讨论】:

    【解决方案2】:

    如果您不想使用&lt;delimiterType&gt;row&lt;/delimiterType&gt;,除了肖恩的回答之外,另一种方法是去掉 DELIMITER $$ 和 $$ 并在插件中使用分号以外的分隔符。

    先改变插件中的分隔符,例如

    <delimiter>;;</delimiter>
    

    那么上面的示例触发器将如下所示

    USE `jellyjolly_schema`;;
    DROP TRIGGER IF EXISTS `jellyjolly_schema`.`delete_user`;;
    USE `jellyjolly_schema`;;
    
    
    CREATE TRIGGER delete_user
    AFTER DELETE
    ON jj_users
    FOR EACH ROW
    BEGIN
        ## delete the posts that belong to the user
        DELETE FROM jj_blog_posts WHERE author_user_id=OLD.user_id;
    END;;
    

    或者您可以使用其他东西作为插件中的分隔符并更改触发器;;相应地

    【讨论】:

      【解决方案3】:

      您可以像这样在sql-maven-plugin 配置中指定新的分隔符:

      &ltconfiguration&gt &ltdelimiter&gt$$&lt/delimiter&gt &lt/configuration&gt

      有关此配置参数的更多信息,请访问page

      【讨论】:

      • 如果部分sql使用delimiter;还有一部分使用了分隔符$$,如何处理?
      • 我不相信这是可能的,对不起。
      猜你喜欢
      • 2012-01-13
      • 2015-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-16
      • 1970-01-01
      • 2023-03-12
      相关资源
      最近更新 更多