2013-02-24 121 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