H2 数据库关于有效 mysql 查询的 sql 语法错误的投诉
H2 database complaints about sql syntax error with a valid mysql query
我创建了一个内存中的 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) 中,我找不到与此相关的任何内容。
有人可以帮忙吗
看起来 H2 不支持从多个 table 中删除的语法,MySQL 支持。看一下 at this answer,它显示了如何使用 DELETE
中的子查询执行此操作。它应该是这样的:
DELETE FROM tableA
WHERE id IN (
SELECT id
FROM tableB
WHERE _iud = 'D'
)
我创建了一个内存中的 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) 中,我找不到与此相关的任何内容。
有人可以帮忙吗
看起来 H2 不支持从多个 table 中删除的语法,MySQL 支持。看一下 at this answer,它显示了如何使用 DELETE
中的子查询执行此操作。它应该是这样的:
DELETE FROM tableA
WHERE id IN (
SELECT id
FROM tableB
WHERE _iud = 'D'
)