合并两个具有连接表的SQLite数据库

3
我有两个SQLite数据库,它们都有连接表来描述一对多的关系。现在这两个数据库需要通过某种导入/导出机制合并为一个,并仍然保持关系。
我尝试使用.dump将DB2转储,然后使用.read将其加载回DB1中,但总是收到“PRIMARY KEY must be unique”警告。
是否有最佳实践来处理这种情况?
首选不使用attach以避免额外的复杂性。
DB1
Fruit
-------------- | id | name | -------------- | 1 | Apple | | 2 | Lemon | | 3 | Kiwi | --------------
Juice ---------------- | id | name | ---------------- | 1 | Juice A | | 2 | Juice B | ----------------
Recipe (连接表)
---------------------------- | id | juice_id | fruit_id | ---------------------------- | 1 | 1 | 1 | | 2 | 1 | 2 | | 3 | 2 | 1 | | 4 | 2 | 3 | ----------------------------
DB2
Fruit
--------------- | id | name | --------------- | 1 | Kiwi | | 2 | Lemon | | 3 | Apple | | 4 | Orange | ---------------
Juice ---------------- | id | name | ---------------- | 1 | Juice C | | 2 | Juice D | ----------------
Recipe (连接表)
---------------------------- | id | juice_id | fruit_id | ---------------------------- | 1 | 1 | 1 | | 2 | 1 | 3 | | 3 | 2 | 2 | | 4 | 2 | 4 | ----------------------------

这些 name 是唯一的吗?在合并后它们应该保持唯一吗? - CL.
如果使用“ATTACH”可以减少复杂性,您是否愿意使用它? - CL.
“name” 可以是唯一的,也可以不是,重要的是要保持连接表的关系并解决主键冲突问题。对我来说,使用 “attach” 就像操作两个子数据库而不是一个单一的数据库。欢迎任何建议。 - Alec
你认为两种不同的水果都叫“苹果”这样可以吗? - CL.
没问题,我可以接受。 - Alec
1个回答

1
如果您不关心重复项,您可以从DB1获取最大ID,并将其添加到DB2中的每个ID。 但是,您说name可能是唯一的,因此让我们正确地处理它。
我假设所有的id列都是INTEGER PRIMARY KEY,即自动递增的。
打开DB1,并附加DB2:
ATTACH '...' AS db2;

复制所有在DB1中不存在的水果和果汁(它们将获得新的ID):

INSERT INTO Fruit(name)
SELECT name
FROM db2.Fruit
WHERE name NOT IN (SELECT name
                   FROM Fruit);
INSERT INTO Juice(name)
SELECT name
FROM db2.Juice
WHERE name NOT IN (SELECT name
                   FROM Juice);

现在复制食谱,同时通过相应的名称查找新的ID值:
INSERT INTO Recipe(juice_id, fruit_id)
SELECT (SELECT id
        FROM Juice
        WHERE name = (SELECT name
                      FROM db2.Juice
                      WHERE id = Recipe2.juice_id)),
       (SELECT id
        FROM Fruit
        WHERE name = (SELECT name
                      FROM db2.Fruit
                      WHERE id = Recipe2.fruit_id))
FROM db2.Recipe AS Recipe2;

如果在“DB1”和“DB2”中,水果的顺序不同,就像原问题中的示例一样,该怎么办? - Alec
然后ID会改变。(这就是那些子查询的全部目的。) - CL.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接