0

我有一台服务器可以备份数据库并每次发送数据库时发送给我......顺便说一句,我不想​​每次发送 50mb 的数据库我做了一个小程序,比如

delete from table where timestamp < ?

获取数据库的最后一个时间戳并将其保存以用于下一次备份,这样我只能发送最新数据(几 kb 而不是 50mb)

现在我想制作另一个程序来合并不同的备份......我被“卡在”插入部分......

    public static void merge(String toMerge) {
Connection c, c2 = null;
Statement stmt, stmt2 = null;

try {
    Class.forName("org.sqlite.JDBC");
    c = DriverManager.getConnection("jdbc:sqlite:merge.db");
    System.out.println("Opened merge.db database successfully");
    c.setAutoCommit(false);
    stmt = c.createStatement();
    c2 = DriverManager.getConnection("jdbc:sqlite:" + toMerge);
    System.out.println("Opened " + toMerge + " database successfully");
    stmt2 = c2.createStatement();

    ResultSet rs = stmt2.executeQuery("SELECT * FROM messages;");
    String sql;
    while (rs.next()) {
    sql = "INSERT INTO messages";
    stmt.executeUpdate(sql);
    }
    rs.close();
    stmt2.close();
    c2.close();

    stmt.close();
    c.commit();
    c.close();
} catch (Exception e) {
    System.err.println(e.getClass().getName() + ": " + e.getMessage());
    System.exit(0);
}
System.out.println("Operation done successfully");

}

我正在考虑打开 2 db... 1 有一个标准名称“merge.db”(这样我可以合并 2+ db),另一个是要合并的...为了使用这种方法,我打开 2 个连接(每个 db 1)并从 db2 中读取每一行并插入新的 db ......但这里我有一些问题

  1. db 有很多 cols,所以我需要使用 200 getInt/String/Float
  2. 我有 NULL 值
  3. 我有很多行

所以如果我使用这种方法,它需要大量的变量和时间来进行插入查询......(现在我正在编写这个方法,但如果有更简单的方法更好......我在想一个包含所有变量的类,并用它来创建 sql insert.. 这样我就可以对不同的表使用相同的函数(只需要为其他类扩展类))

在表中编辑 我有 blob 真正的 int 字符串值(总共 29 列)

4

1 回答 1

1

如果您在同一个数据库中有两个表,则可以使用如下语句:

INSERT INTO messages1 SELECT * FROM messages2

当您有两个不同的数据库文件时,您可以将一个附加到另一个:

ATTACH DATABASE '...' AS toMerge

然后通过在表名前加上数据库名来访问它:

INSERT INTO messages SELECT * FROM toMerge.messages
于 2013-07-29T19:33:00.513 回答