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 中的条件插入失败的主要内容,如果未能解决你的问题,请参考以下文章
SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase(代码片