HSQL 中的条件插入失败

Posted

技术标签:

【中文标题】HSQL 中的条件插入失败【英文标题】:Conditional insert failing in HSQL 【发布时间】:2018-11-27 04:05:33 【问题描述】:

我正在使用 HSQL 执行条件插入,但它一直失败并出现异常。

Java + MyBatis + HSQL

查询:

INSERT INTO CATS (ID, NAME) 
SELECT #id, #name
WHERE NOT EXISTS 
    (SELECT * from CATS WHERE NAME = #name)

例外:

Caused by: java.sql.SQLSyntaxErrorException: unexpected token: WHERE in statement [INSERT INTO CATS (ID, NAME) select ?, ? WHERE NOT EXISTS (SELECT * from CATS WHERE NAME = ?)]
[junit]     at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
[junit]     at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
[junit]     at org.hsqldb.jdbc.JDBCPreparedStatement.<init>(Unknown Source)
[junit]     at org.hsqldb.jdbc.JDBCConnection.prepareStatement(Unknown Source)
[junit]     at org.apache.ibatis.datasource.pooled.PooledConnection.invoke(PooledConnection.java:245)
[junit]     at com.sun.proxy.$Proxy49.prepareStatement(Unknown Source)

我检查了 HSQL 是否不支持条件插入。但是好像不是这样的

我已经执行了set database sql syntax pgs true,所以在 HSQL 中执行 RAW postgres 查询应该没有任何问题

【问题讨论】:

【参考方案1】:

当你想动态获取列时,你需要使用$而不是#

INSERT INTO CATS (ID, NAME) 
SELECT $id, $name
WHERE NOT EXISTS 
    (SELECT * from CATS WHERE NAME = #name)

【讨论】:

【参考方案2】:

问题是我的条件插入查询是 postgres 特定的,不能在 HSQL 中执行。我继续使用 otj-pg-embedded 运行时 postgres 实例而不是 HSQL 并且查询有效。

【讨论】:

以上是关于HSQL 中的条件插入失败的主要内容,如果未能解决你的问题,请参考以下文章

无法删除 HSQLDB 文件

SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase(代码片

Weblogic 中的 HSQL 配置

React Native Redux App 中的条件渲染失败

如何有条件地插入或替换 SQLite 中的一行?

验证通常失败时 JSF 中的条件样式