1

私は一連のファイルを解析し、それらに関する情報をsqliteを使用してデータベース内に配置するJavaで書かれたプログラムを持っています。ある日、この例外が発生するまで、コードはしばらくの間正常に動作するようです:

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)

結局のところ、2 つのファイルが何らかの形でコード内で互いに干渉していました。私はまだ同じ問題を引き起こす小さなプログラムを構築しました。

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>

だから私は何か間違ったことをしているのですか?なぜこれはほとんどの文字列で機能しますが、すべてではありませんか? 一意性は単純でない方法で計算されていますか?

4

2 に答える 2

2

ID列に制約を適用したため、列IDUNIQUEに既存の値を挿入しようとするとエラーが発生します

于 2013-04-08T12:00:33.313 に答える
0

問題は間違ったデータ型の使用に関連していたようです。STRING ではなく TEXT にする必要がありました。sqliteのドキュメントから:

「POINT」の末尾に「INT」があるため、「FLOATING POINT」の宣言されたタイプは、REAL アフィニティではなく、INTEGER アフィニティを与えることに注意してください。また、「STRING」の宣言された型には、TEXT ではなく NUMERIC の親和性があります。

そのため、文字列 "111111111E311" は OK 番号と見なされますが、大きすぎてエントリに入力されるのは NaN です。文字列「111111111E211」は少し小さくなり、そのまま収納できます。

于 2013-04-09T01:46:47.220 に答える