java.sql.SQLException:接近“on”:语法错误问题
Posted
技术标签:
【中文标题】java.sql.SQLException:接近“on”:语法错误问题【英文标题】:java.sql.SQLException: near "on": syntax error problem 【发布时间】:2018-12-19 10:24:21 【问题描述】:在 Sqlite 3.6.0 中,如果存在或插入,我想更新记录。但是我收到一个错误,因为
java.sql.SQLException: near "on": syntax error
我的sql查询如下;
INSERT INTO tx (
_id,
amount,
fee,
prev_hash,
nonce,
action_time,
completion_time,
_from,
_to,
asset,
hash,
block,
seq,
[desc]
)
VALUES (
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?,
?
)
ON CONFLICT (
_id
)
DO UPDATE SET amount = 1.0,
fee = 0.001,
prev_hash = 'e6d0ca4b71488972cb149eef427ffbeb6132449c045c88db89ddaa8ab0c3611f',
nonce = 1544773280,
action_time = 1544773276808,
completion_time = 1544773276808,
_from = 'SKK1P5eQqoN7FBKnughbvp3UBK2CyjRQhHBp',
_to = 'SKK1KuAwe4kR1SfdoXDiQStVtRPvdTVaKy2ry',
asset = 'SKK',
hash = '',
block = 100,
seq = 15288,
[desc] = 'denemee'
我的代码块如下;
sql = "insert into tx (_id,amount,fee,prev_hash,nonce,action_time,completion_time,_from,_to,asset,hash,block,seq,desc) "
+ "values (?,?,?,?,?,?,?,?,?,?,?,?,?,?) on conflict (_id) do update set "
+ "amount =" + tx.amount + ",fee=" + tx.fee + ",prev_hash='" + tx.prev_hash
+ "'" + ",nonce=" + tx.nonce + ",action_time=" + tx.action_time
+ ",completion_time=" + tx.action_time + ",_from='" + tx.wallet + "'" + ",_to='"
+ tx.to + "'" + ",asset='" + tx.asset + "'" + ",hash=''" + ",block=100"
+ ",seq=" + tx.seq + ",desc='" + tx.desc + "'";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, tx._id);
pstmt.setString(2, String.valueOf(tx.amount));
pstmt.setString(3, String.valueOf(tx.fee));// fee
pstmt.setString(4, tx.prev_hash);// prev_hash
pstmt.setString(5, tx.nonce);// nonce
pstmt.setString(6, String.valueOf(tx.action_time));// action time
pstmt.setString(7, "");// completion_time
pstmt.setString(8, tx.wallet);// from
pstmt.setString(9, tx.to); // to
pstmt.setString(10, tx.asset);// asset
pstmt.setString(11, tx.hash);// hash
pstmt.setString(12, "");// block
pstmt.setInt(13, tx.seq);// seq
pstmt.setString(14, tx.desc);// desc
pstmt.executeUpdate();
原始查询在 sqlitestudio 成功运行,但出现错误。我知道 sqlite 版本 3.6.0 支持 upsert 事件。我在哪里做错了。我该如何正确处理这个问题。
【问题讨论】:
【参考方案1】:您的问题是由于
我知道 sqlite 版本 3.6.0 支持 upsert 事件。
INSERT..... ON CONFLICT .... DO....
(称为 UPSERT)的使用仅适用于 3.24.0 版本。
尝试在 3.24.0 之前的版本中使用 UPSERT (DO.....) 将导致 syntax error at ON
根据
UPSERT 是对 INSERT 的一种特殊语法,它会导致 INSERT 如果 INSERT 违反了 唯一性约束。 UPSERT 不是标准 SQL。 SQLite 中的 UPSERT 遵循 PostgreSQL 建立的语法。添加了 UPSERT 语法 到版本 3.24.0 (2018-06-04) 的 SQLite。
UPSERT 是一个普通的 INSERT 语句,后跟 上面显示的特殊 ON CONFLICT 子句。
SQL As Understood By SQLite - upsert
您需要使用 3.24.0 或更高版本的 SQLite 或寻找替代方法。
【讨论】:
但我了解我的 sqlite jar 版本 3.6.0。所以3.6.0版本高于3.24版本。出现这样的错误是否正常。 @Baltazar 好的,那么当你给我较低的 2400 万美元时,我会给你 600 万美元?或者阅读Version Numbers in SQLite。 哦,你是对的。我对版本感到困惑。但是找不到3.24版本的jar。你知道吗? @Baltazar 抱歉,但我只使用我使用的工具附带的任何版本,并且由于我的大部分工作都是在 android 上,所以我倾向于避开新功能。附: 3.26.0 现已推出。 好的,非常感谢。我在central.maven.org/maven2/org/xerial/sqlite-jdbc/3.25.2找到版本以上是关于java.sql.SQLException:接近“on”:语法错误问题的主要内容,如果未能解决你的问题,请参考以下文章
java.sql.SQLException: SQL 语句在 org.hsqldb.jdbc.JDBCUtil.sqlException 处关闭
Oracle DB:java.sql.SQLException:关闭连接
Cause: java.sql.SQLException: 请求的转换无效 ; uncategorized SQLException for SQL []; SQL state [99999]; er
java.sql.SQLException: ORA-00604: 递归 SQL 级别 1 发生错误