2013-04-08 53 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