2013-02-24 79 views
2

我有兩個SQLite數據庫,每個數據庫都有一個表,我需要通過合併具有相同鍵的行來保持同步。這些表格佈局是這樣的:SQLite,根據列中的較高值合併兩個表

CREATE TABLE titles (name TEXT PRIMARY KEY, 
         chapter TEXT    , 
         page INTEGER DEFAULT 1 , 
         updated INTEGER DEFAULT 0 ); 

我希望能夠在每兩個表中運行相同的命令,與具有相同對行,無論行有結果在更新的中更大的值將完全覆蓋另一行,並且不具有匹配的行被複制,因此兩個表完成時是相同的。

這是一個Android應用程序,所以我可以在Java中進行比較,但如果可能的話我更喜歡SQLite解決方案。我對SQL不太熟悉,所以你可以給出的解釋越多,它就會有幫助。

編輯
爲了澄清:我需要的東西,我可以在任意時間執行,由其他代碼調用。兩個數據庫中的一個並不總是存在,並且在另一個數據庫的操作發生時可能不完整,所以我認爲觸發器不會起作用。

回答

0

假設你有attached其他數據庫到主數據庫:

ATTACH '/some/where/.../the/other/db-file' AS other; 

你可以先刪除將被改寫,因爲他們updated字段是其他表比相應updated場較小的所有記錄:

DELETE FROM main.titles 
WHERE updated < (SELECT updated 
       FROM other.titles 
       WHERE other.titles.name = main.titles.name); 

,然後複製所有新的和丟失的記錄:

INSERT INTO main.titles 
SELECT * FROM other.titles 
WHERE name NOT IN (SELECT name 
        FROM main.titles); 

要在另一個方向上更新,請交換main/other數據庫名稱。

+0

這看起來正是我所需要的。謝謝! – 2013-02-25 00:31:38

0

爲此,您可以使用觸發器。

CREATE TRIGGER sync_trigger 
AFTER INSERT OR UPDATE OF updated ON titles 
REFERENCING NEW AS n 
FOR EACH ROW 
DECLARE updated_match; 
DECLARE prime_name; 
DECLARE max_updated; 
BEGIN 
    SET prime_name = n.name; 
    ATTACH database2name AS db2; 
    SELECT updated 
    INTO updated_match 
    FROM db2.titles t 
    WHERE t.name=prime_name) 

    IF updated_match is not null THEN 
     IF n.updated > updated_match THEN 
      SET max_updated=n.updated; 
     ELSE 
      SET max_updated=updated_match; 
     END IF; 

     UPDATE titles 
     SET updated=max_updated 
     WHERE name=prime_name; 

     UPDATE db2.titles 
     SET updated=max_updated 
     WHERE name=prime_name; 
    END IF; 
END sync_trigger; 

的語法可以是有點偏離。我並不經常使用觸發器,這是一個相當複雜的觸發器,但它應該讓您知道至少從哪裏開始。您需要將其分配給一個數據庫,將「database2name」交換爲其他數據庫的名稱,然後再將其分配給另一個數據庫,然後將「database2name」交換爲另一個數據庫。

希望這會有所幫助。

+0

通常我會說使用存儲過程,但SQLite3不支持它們。 =( – jonbonazza 2013-02-24 05:24:56

+0

似乎我沒有足夠的聲望來支持您的答案,所以請考慮這個非正式的感謝,因爲它會一次性向我提供所有Google的幫助); – 2013-02-24 06:18:08

+0

這是無效的SQLite語法。 – 2013-02-24 10:50:45