2

我有两个 SQLite 数据库,每个数据库都有一个表,我需要通过合并具有相同键的行来保持同步。这些表的布局如下:

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

我希望能够在两个表中的每一个上运行相同的命令,结果对于具有相同名称的行对,更新中具有较大值的行将完全覆盖另一行,而没有的行有一个匹配被复制,所以两个表在完成时是相同的。

这是一个 Android 应用程序,所以我可以在 Java 中进行比较,但如果可能的话,我更喜欢 SQLite 解决方案。我对 SQL 不是很有经验,所以你能给出的解释越多,它就越有帮助。

编辑
澄清一下:我需要可以在任意时间执行的东西,以便由其他代码调用。两个数据库中的一个并不总是存在,并且在另一个数据库上发生操作时可能不会完全完整,所以我认为触发器不会起作用。

4

2 回答 2

0

为此,您可以使用触发器。

IE

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”交换为另一个数据库。

希望这可以帮助。

于 2013-02-24T05:11:52.967 回答
0

假设您已将另一个数据库附加到主数据库:

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数据库名称。

于 2013-02-24T11:13:07.083 回答