【问题标题】:Error in SQL syntax when running SQL in Java but not in HeidiSQL在 Java 中运行 SQL 而不是在 HeidiSQL 中运行 SQL 时出现 SQL 语法错误
【发布时间】:2020-05-30 09:36:50
【问题描述】:

我正在尝试在表上运行 insertupdate - 从下面生成的字符串在复制粘贴到 HeidiSQL 时工作正常,但在运行时抛出 SQLSyntaxErrorExceptions来自Java:

Statement statement = con.createStatement();
String escapedXML = EscapeString(billboard.getXml());
String sql = String.format(
    "DELIMITER $ \r\nBEGIN NOT ATOMIC\r\n" +
    "IF EXISTS(SELECT * FROM billboards where Name='%s') THEN UPDATE billboards SET XML='%s' where Name='%s';\r\n" +
    "ELSE insert into billboards(Name, XML, CreatorName) values('%s', '%s', '%s');\r\n" +
    "END IF;\r\n" +
    "END $\r\n" +
    "DELIMITER ;", billboard.getName(), escapedXML, billboard.getName(), billboard.getName(), escapedXML, billboard.getCreatorName());
// Insert or update billboard
statement.execute(sql);

我不知道为什么。

【问题讨论】:

  • 嗨!了解它引发的整个错误对于尝试找出正在发生的事情非常有帮助。你能把它贴在这里吗?
  • 当然可以:java.sql.SQLSyntaxErrorException: (conn=113) 你的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,了解在 'DELIMITER |\r 附近使用的正确语法
  • @ConnorWilson 为什么你的问题有标签sql-server 而不是MariaDB
  • 修复了我的错误
  • 您好,请查看错误日志,它通常会提示您哪里出了问题。也许 \r 不是 SQL 语法的正确分隔符。

标签: java sql sql-update mariadb sql-insert


【解决方案1】:

我建议在这里使用insert ... ok duplicate key 语法而不是代码块。这样效率更高,并且在单个语句中实现了锁定,这应该可以避免您在从 php 代码运行查询时遇到的问题。

insert into billboards(Name, XML, CreatorName) 
values(?, ?, ?)
on duplicate key update set XML = values(XML)

为此,您需要对列 Name 设置唯一(或主键)约束。

另外,考虑在查询字符串中使用参数化查询而不是连接变量W转义效率低下,并不能真正使您的代码更安全。

【讨论】:

    【解决方案2】:

    您应该在查询中尝试NamedParameterStatement 以方便设置字符串参数并避免它们重复(使用GMB's earlier answer 中建议的重构查询):

    String sql = "INSERT INTO billboards (Name, XML, CreatorName) VALUES (:name, :xml, :creator) "
                 + "ON DUPLICATE KEY UPDATE SET XML = :xml";
    
    NamedParameterStatement statement = new NamedParameterStatement(con, sql);
    statement.setString("name", billboard.getName());
    statement.setString("xml", EscapeString(billboard.getXml()));
    statement.setString("creator", billboard.getCreatorName());
    
    // Insert or update billboard
    statement.execute(sql);
    

    【讨论】:

      【解决方案3】:

      您收到语法错误的原因是 DELIMITER 是 MySQL 客户端命令而不是 SQL 语句。 MySQL 命令不能与 JDBC 一起使用。

      更多信息:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-09
        • 2021-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多