2013-04-08 83 views
1

我有一个用Java编写的程序,它解析一组文件并使用sqlite在数据库中放置关于它们的信息。该代码似乎很好地工作一段时间,直到有一天,我得到这个异常:java.sql.SQLException:列ID不唯一

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> 

所以我做错了什么,为什么这对大多数字符串,但不是全部?唯一性是以非直接的方式计算的?

+0

您是否正在同时运行多个这些测试/程序? – Perception 2013-04-08 12:07:25

回答

0

这似乎是问题涉及到使用了错误的数据类型,它应该插入任何现有的值,它会给错误已经TEXT而不是STRING。从sqlite documentation

注意,“浮点”的声明类型会给INTEGER亲和力,不是真正的亲和力,由于“INT”在“要点”中结束。而“STRING”的声明类型具有NUMERIC的亲和力,而不是TEXT。

所以字符串“111111111E311”将被视为一个OK号码,但是太大而且放入的是NaN。字符串“111111111E211”略小,可以保存原样。

2

,因为你已经申请UNIQUE的ID列约束,如果你尝试在列ID

+0

那么这就是问题所在,在我的示例中id列中的两个条目不是唯一的? “0325E498”和“111111111E311”是两个完全不同的字符串。 – user2257275 2013-04-09 00:33:47