在Java中合并SQLite数据库会引发“唯一约束失败”

时间:2015-03-01 14:24:14

标签: java sqlite merge constraints

我正在尝试将两个SQLite数据库与Java合并。数据库方案生成如下:

public static void createDatabaseTables(Connection c)
{
    String sql;

    // creates the table HASHES
    sql = "CREATE TABLE HASHES("
            + "INPUTVALUE TEXT PRIMARY KEY,"
            + "HASHVALUE TEXT);";
    executeUpdate(c, sql);
    System.out.println("Table HASHES created successfully");
}

我使用以下代码合并两个数据库(第一个是空的,第二个包含一些值(inputvalues和适当的pearson哈希值))。

public static void mergeDatabases(String path1, String path2)
{
    // open a database connection
    Connection c = openDatabaseConnection(path1);

    // end the actual transaction (must be done to attach a new database)
    executeUpdate(c,"end transaction");

    // attach the second database to the first one
    String sql = "ATTACH DATABASE '" + path2 + "' AS toMerge";
    executeUpdate(c, sql);

    // copy the calculated hashes from the second database to the first one
    sql = "INSERT INTO HASHES SELECT * FROM toMerge.HASHES";
    executeUpdate(c, sql);

    // begin a transaction
    executeUpdate(c, "begin transaction");

    // close the connection
    closeDatabaseConnection(c);

    System.out.println("Databases merged.");
}

这导致我对每一行都有以下异常(因为如果我在INSERT中添加“OR IGNORE”子句,则忽略每一行)

java.sql.SQLException: UNIQUE constraint failed: HASHES.INPUTVALUE

我确信列INPUTVALUE的值是唯一的(因为它们是在循环中使用每个ascii符号生成的)。不过我得到了例外。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

我终于解决了这个问题。 SQLite数据库有两个连接同时导致这个奇怪的问题。