Java SQL错误或缺少数据库(接近“重复”:语法错误
我有一个SQLLITE数据库Java SQL错误或缺少数据库(接近“重复”:语法错误,java,sql,sqlite,Java,Sql,Sqlite,我有一个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)&
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\u ERROR]SQL错误或缺少数据库(接近“重复”:语法错误)
预期的功能是使用uuid插入,如果uuid不存在,则值为1,否则将指定的列增加1
如何解决此问题?在SQLite中,必须在重复键上使用子句,而不是
此外,不需要使用列已具有的相同值更新列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();
重复密钥更新时的是MySQL语法,而不是SQLite synax。如果您使用的版本足够新,可以支持SQLite(和postgres)调用的语法(3.24或更新版本)。