java.sql.SQLException:列id不唯一
我有一个用Java编写的程序,它解析一组文件,并使用sqlite将有关这些文件的信息放在数据库中。代码在一段时间内似乎工作正常,直到有一天我遇到了这个异常:java.sql.SQLException:列id不唯一,java,sqlite,sqlexception,Java,Sqlite,Sqlexception,我有一个用Java编写的程序,它解析一组文件,并使用sqlite将有关这些文件的信息放在数据库中。代码在一段时间内似乎工作正常,直到有一天我遇到了这个异常: Exception in thread "main" java.sql.SQLException: column id is not unique at org.sqlite.DB.throwex(DB.java:370) at org.sqlite.DB.executeBatch(DB.java:302) at org.sqlite.Pr
Exception in thread "main" java.sql.SQLException: column id is not unique
at org.sqlite.DB.throwex(DB.java:370)
at org.sqlite.DB.executeBatch(DB.java:302)
at org.sqlite.PrepStmt.executeBatch(PrepStmt.java:93)
at DatabaseTest.main(DatabaseTest.java:43)
事实证明,在我的代码中,两个文件以某种方式相互干扰。我已经构建了一个较小的程序,它仍然给出相同的问题
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
public class DatabaseTest {
public static void main(String[] args) throws SQLException {
System.out.println(new org.sqlite.JDBC().toString());
Connection conn = DriverManager.getConnection("jdbc:sqlite:my_file.sqlite");
Statement stat = conn.createStatement();
try {
stat.executeUpdate("drop table if exists my_table;");
stat.executeUpdate("create table my_table (id STRING UNIQUE, content STRING);");
PreparedStatement prep = conn.prepareStatement("insert into my_table values (?, ?);");
prep.setString(1, "0325E498"); // I keep this value same for all tests
prep.setString(2, "test1");
prep.addBatch();
//prep.setString(1, "0336E810"); // Gives error
//prep.setString(1, "0336E8100"); // Gives error
//prep.setString(1, "0336E8100000"); // Gives error
//prep.setString(1, "0336E8111111"); // Gives error
//prep.setString(1, "1336E811"); // Gives error
//prep.setString(1, "9336E811"); // Gives error
//prep.setString(1, "A336E811"); // OK!
//prep.setString(1, "111111111E811"); // Gives error
prep.setString(1, "111111111E311"); // Gives error
//prep.setString(1, "111111111E211"); // OK!
prep.setString(2, "test2");
prep.addBatch();
conn.setAutoCommit(false);
prep.executeBatch(); // Exception thrown here
conn.setAutoCommit(true);
} finally {
stat.close();
conn.close();
}
}
我当前的maven依赖信息
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.7.2</version>
</dependency>
org.xerial
sqlite jdbc
3.7.2
那么,我做错了什么,为什么这对大多数字符串有效,但对所有字符串无效?唯一性是以非直接方式计算的吗?由于您对id列应用了
唯一性约束,如果您尝试在列id中插入任何现有值,则会出现错误。问题似乎与使用错误的数据类型有关,它应该是文本而不是字符串。发件人:
请注意,由于“点”末尾的“INT”,声明的“浮点”类型将给出整数关联,而不是实关联。并且声明的“STRING”类型与数值关联,而不是文本
因此字符串“111111111 E311”将被视为一个OK数字,但它太大,输入的是NaN。字符串“111111111 E211”稍小一些,可以按原样存储。您是否同时运行多个测试/程序?这就是问题所在,在我的示例中,id列中的两个条目以何种方式不唯一?“0325E498”和“11111111 E311”是两个完全不同的字符串。