Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SQL错误或缺少数据库(接近“重复”:语法错误_Java_Sql_Sqlite - Fatal编程技术网

Java SQL错误或缺少数据库(接近“重复”:语法错误

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)&

我有一个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\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或更新版本)。