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

답변

0

, 그것은해야 열에있는 값을 삽입 할 경우 id 컬럼에 UNIQUE 제약 조건을 적용했기 때문에, 그것은 오류를 줄 것이다 STRING 대신 TEXT가되었습니다. sqlite documentation에서 :

참고 "부동 소수점"의 선언 된 형태 때문에 "포인트"의 끝 부분에 "INT"로, INTEGER에게 친화력하지 REAL 친화력을 줄 것이다. 선언 된 유형의 'STRING'은 TEXT가 아닌 NUMERIC의 유사도를가집니다.

문자열 "111111111E311"은 확인 번호로 간주되지만 너무 커서 항목의 내용은 NaN입니다. "111111111E211"문자열은 약간 작아서 그대로 저장할 수 있습니다.

2

당신이 ID가 문제가 잘못된 데이터 유형을 사용하여 관련 된 것 같다

+0

예를 들어 id 칼럼의 두 항목이 고유하지 않다는 것이 핵심입니다. "0325E498"과 "111111111E311"은 상당히 다른 문자열입니다. – user2257275

관련 문제