2013-07-29 79 views
0

我有一個服務器備份分貝,併發送給我每次分貝... btw bc我不想每次發送50mb的分貝我做了一個像合併2數據庫具有相同的結構

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分貝... 1有一個標準名稱「merge.db」(這樣我可以合併2+分貝),另一個是合併... 使用這種方法我打開(每個DB 1)2連接,並讀取DB2每一行,並在新的數據庫插入......但在這裏我有幾個問題

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

所以如果我使用這種方法,它需要大量的瓦爾和時間,使插入查詢... (現在我正在寫這種方法,但如果有一個更簡單的方法來做這是更好.. 。我正在考慮用所有變量創建一個類,並使用它創建sql插入..這樣,我可以對不同的表使用相同的函數(只需要擴展其他類的類))

編輯 在表中我有blob實際int字符串值(共29列)

回答

0

如果您有兩個表在同一個數據庫中,您可以使用像這樣的語句:

INSERT INTO messages1 SELECT * FROM messages2 

當你有兩個不同的數據庫文件,您可以ATTACH一個到另一個:

INSERT INTO messages SELECT * FROM toMerge.messages 

ATTACH DATABASE '...' AS toMerge 

,然後通過與數據庫名稱前綴的表名訪問

相關問題