Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.sql.SQLException:列id不唯一_Java_Sqlite_Sqlexception - Fatal编程技术网

java.sql.SQLException:列id不唯一

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

我有一个用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.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”是两个完全不同的字符串。