SQL ошибка или отсутствует база данных (рядом с "DUPLICATE": синтаксическая ошибка - PullRequest
0 голосов
/ 10 июля 2020

У меня есть база данных SQLLITE

String query = "CREATE TABLE IF NOT EXISTS plottokens (uuid TEXT PRIMARY KEY NOT NULL, plot INTEGER DEFAULT 0, autoplot INTEGER DEFAULT 0, addon INTEGER DEFAULT 0, combination INTEGER DEFAULT 0, roadcombination INTEGER DEFAULT 0)";

Я пытаюсь запустить

TokenDatabase service = TokenDatabase.getInstance();
Connection connection = service.getConnection();
String query = String.format("INSERT INTO plottokens (`uuid`, `%s`) VALUES (?, 1) ON DUPLICATE KEY UPDATE `uuid`=?, `%s`=`%s`+1", tokenType, tokenType, tokenType);
PreparedStatement preparedStatement = connection.prepareStatement(query);
preparedStatement.setString(1, uuid.toString());
preparedStatement.setString(2, uuid.toString());
preparedStatement.executeUpdate();

, где tokenType - это одна из предопределенных строк, например, «plot».

Это дает мне org.sqlite.SQLiteException: [SQLITE_ERROR] SQL error or missing database (near "DUPLICATE": syntax error)

Предполагаемая функциональность - вставить с uuid и значением 1, если uuid не существует, иначе увеличить указанный столбец на 1.

Как это исправить?

1 Ответ

0 голосов
/ 10 июля 2020

В SQLite вы должны использовать предложение ON CONFLICT вместо ON DUPLICATE KEY. Также нет необходимости обновлять столбец uuid с тем же значением, которое у него уже есть. Вам нужно только обновить другой столбец:

String query = String.format("INSERT INTO plottokens (`uuid`, `%s`) VALUES (?, 1) ON CONFLICT(`uuid`) DO UPDATE SET `%s`=`%s`+1", tokenType, tokenType, tokenType);
PreparedStatement preparedStatement = connection.prepareStatement(query);
preparedStatement.setString(1, uuid.toString());
preparedStatement.executeUpdate();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...