【问题标题】:H2 database complaints about sql syntax error with a valid mysql queryH2 数据库关于有效 mysql 查询的 sql 语法错误的投诉
【发布时间】:2019-07-24 12:44:11
【问题描述】:

我创建了一个内存 H2 数据库 (http://www.h2database.com/html/features.html),如下所示

public static HikariConfig createHikariConfigH2(String schema, String pathToSchemaSql) {
    LOGGER.info("Creating schema {} and execute sql {}", schema, pathToSchemaSql);
    HikariConfig config = new HikariConfig();

    config.setJdbcUrl("jdbc:h2:mem:" + schema + ";"

            + "MODE=MySQL;DATABASE_TO_LOWER=TRUE;CASE_INSENSITIVE_IDENTIFIERS=TRUE"

            + ";DB_CLOSE_DELAY=-1" + ";INIT= drop schema if exists " + schema + " CASCADE\\;create schema " + schema
            + "\\;SET SCHEMA " + schema + "\\;"

            + "runscript from 'classpath:/" + pathToSchemaSql + "'");
    config.setUsername("sa");
    config.setPassword("");
    return config;
}

然后我尝试如下运行sql查询

HikariConfig config = createHikariConfigH2(“schema”, “a.sql”);
        try (HikariDataSource master = new HikariDataSource(config);
                Connection conn = master.getConnection();
                PreparedStatement stmt = conn.prepareStatement(
                        "DELETE mt FROM tableA AS mt,tableB AS et WHERE mt.id = et.id AND et._iud = 'D'")) {
            try (ResultSet result = stmt.executeQuery()) {
                List<String> tables = new ArrayList<>();
                while (result.next()) {
                    String tableName = result.getString(1);
                    tables.add(tableName);
                }
            }
        }

但它抱怨语法错误,但相同的查询在普通 mysql db 上工作正常

org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "delete mt from tableA as mt,[*]tableB as et where mt.id = et.id and et._iud = 'D' "; SQL statement:
DELETE mt FROM tableA AS mt,tableB AS et WHERE mt.id = et.id AND et._iud = 'D' [42000-199]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:451)
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:427)
    at org.h2.message.DbException.get(DbException.java:205)
    at org.h2.message.DbException.get(DbException.java:181)
    at org.h2.message.DbException.getSyntaxError(DbException.java:229)
    at org.h2.command.Parser.getSyntaxError(Parser.java:989)
    at org.h2.command.Parser.prepareCommand(Parser.java:686)
    at org.h2.engine.Session.prepareLocal(Session.java:627)

在 mysql 兼容性部分 (http://www.h2database.com/html/features.html#compatibility) 中,我找不到与此相关的任何内容。

有人可以帮忙

【问题讨论】:

  • 要验证查询,请尝试在 MySQL 数据库中运行查询。我认为您的查询中有一些错误
  • 因为H2中的DELETE不支持delete mt from ...MySQL 也是如此。你想让这个 SQL 做什么?
  • @LutzHorn 谢谢。我没有看到那个链接
  • @LutzHorn 从我看到的(第一眼)here 它接缝 H2 应该支持 MySQL 的多表语法..
  • 也许,但不是delete mt from ...

标签: java h2


【解决方案1】:

H2 似乎不支持从多个表中删除的语法,这是 MySQL 支持的。看看at this answer,它展示了如何使用DELETE 中的子查询来做到这一点。它应该是这样的:

DELETE FROM tableA 
WHERE id IN (
    SELECT id 
    FROM tableB 
    WHERE _iud = 'D'
)

【讨论】:

  • 您能否告诉我是否必须匹配表的 2 列(例如:id 和名称),那么查询应该如何 - .. id 和名称在哪里(选择 id,名称) ?
  • id一般是PK应该够了,你确定还需要name吗?
  • 是的,在我的情况下,id 不是 PK。我认为“其中 id 和 name 在 (select id, name)”对我有用
  • 没有 H2 来测试这个,但也许 ... WHERE (id, name) IN (SELECT b.id, b.name FROM tableB AS b WHERE b._iud = 'D')
  • 我正在尝试转换我的更新查询 - “UPDATE table1 AS mt, table2 AS et SET mt.country_name = et.country_name, mt.country_continent = et.country_continent WHERE mt.id = et.id “到h2,我被卡住了。我尝试作为 UPDATE table1 AS mt , table2 as et SET (mt.country_name, mt.country_continent ) = ( SELECT et.country_name, et.country_continent FROM table2 AS et WHERE mt.id = et.id ) 但更改后的查询失败正常的 sql 数据库。你能帮帮我吗
猜你喜欢
  • 2021-01-21
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多