java.sql.SQLException: около "on": проблема синтаксической ошибки - PullRequest
0 голосов
/ 19 декабря 2018

В 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 Ответ

0 голосов
/ 19 декабря 2018

Ваша проблема связана с

Я знаю, что sqlite версии 3.6.0 поддерживает событие upsert.

Использование INSERT..... ON CONFLICT .... DO.... (что называется UPSERT ) доступно только с версии 3.24.0.

Попытка использовать UPSERT (DO .....) в версии, предшествующей 3.24.0, приведет к syntax error at ON

согласно

UPSERT - это специальное синтаксическое дополнение к INSERT, которое заставляет INSERT вести себя как UPDATE или no-op, если INSERT нарушает ограничение уникальности.UPSERT не является стандартным SQL.UPSERT в SQLite следует синтаксису, установленному PostgreSQL.Синтаксис UPSERT был добавлен в SQLite с версией 3.24.0 (2018-06-04).

UPSERT - это обычный оператор INSERT, за которым следует специальное предложение ON CONFLICT, показанное выше.

SQL в понимании SQLite - upsert

Вам нужно либо использовать версию SQLite версии 3.24.0 или выше, либо найти альтернативный подход.

...