小编典典

合并两个都有联结表的SQLite数据库

sql

我有两个SQLite数据库,两个数据库都有连接表来描述 一对多
关系。现在,需要使用某种导入/导出机制将这两个数据库合并到一个数据库中,并且仍然保持关系。

我尝试使用来转储 DB2.dump然后使用来将其重新加载到 DB1.read,但始终收到PRIMARY KEY mustbe unique警告。

是否有最佳实践来处理这种情况?

最好不要使用attach以避免额外的复杂性。


DB1

Fruit

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

果汁

----------------
| id | 名称|
----------------
| 1 | JuiceA |
| 2 | JuiceB |
----------------

配方(连接表)

----------------------------
| 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 | 名称|
----------------
| 1 | JuiceC |
| 2 | JuiceD |
----------------

配方(连接表)

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

阅读 160

收藏
2021-03-23

共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;
2021-03-23