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

时间:2013-11-14 03:14:21

标签: sql database sqlite

我有两个SQLite数据库,它们都有连接表来描述一对多关系。现在这两个DB需要合并为一个具有某种导入/导出机制的数据库,并且仍然保持关系。

我尝试使用.dump转储 DB2 ,然后使用.read将其加载回 DB1 ,但总是得到PRIMARY KEY must be unique警告。

有没有最好的做法来处理这种情况?

首选不要使用attach来避免额外的复杂性。


DB1

水果

--------------
| id | name  |
--------------
| 1  | Apple |
| 2  | Lemon |
| 3  | Kiwi  |
--------------

果汁

----------------
| id | name    |
----------------
| 1  | Juice A |
| 2  | Juice B |
----------------

配方(接合表)

----------------------------
| id | juice_id | fruit_id |
----------------------------
| 1  | 1        | 1        |
| 2  | 1        | 2        |
| 3  | 2        | 1        |
| 4  | 2        | 3        |
----------------------------

DB2

水果

---------------
| id | name   |
---------------
| 1  | Kiwi   |
| 2  | Lemon  |
| 3  | Apple  |
| 4  | Orange |
---------------

果汁

----------------
| id | name    |
----------------
| 1  | Juice C |
| 2  | Juice D |
----------------

配方(接合表)

----------------------------
| id | juice_id | fruit_id |
----------------------------
| 1  | 1        | 1        |
| 2  | 1        | 3        |
| 3  | 2        | 2        |
| 4  | 2        | 4        |
----------------------------

1 个答案:

答案 0 :(得分:0)

如果您不关心重复项,可以从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;