【问题标题】:SQL error or missing database (near "DUPLICATE": syntax errorSQL 错误或缺少数据库(“DUPLICATE”附近:语法错误
【发布时间】:2020-07-10 00:56:43
【问题描述】:

我有一个 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,如果 uuid 不存在则值为 1,否则将指定列增加 1。

我该如何解决这个问题?

【问题讨论】:

  • on duplicate key update 是 MySQL 语法,而不是 SQLite 语法。
  • 您想要 sqlite(和 postgres)调用的 upsert,假设您使用的版本足够新以支持该语法(3.24 或更高版本)。

标签: java sql sqlite


【解决方案1】:

在 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();

【讨论】:

    猜你喜欢
    • 2021-04-28
    • 2018-04-10
    • 2017-02-11
    • 2021-07-31
    • 1970-01-01
    • 2017-10-18
    • 2020-12-11
    • 2018-01-19
    • 2016-08-14
    相关资源
    最近更新 更多