我有两个SQLite数据库,两个数据库都有连接表来描述 一对多 关系。现在,需要使用某种导入/导出机制将这两个数据库合并到一个数据库中,并且仍然保持关系。
我尝试使用来转储 DB2 ,.dump然后使用来将其重新加载到 DB1 中.read,但始终收到PRIMARY KEY mustbe unique警告。
.dump
.read
PRIMARY KEY mustbe unique
是否有最佳实践来处理这种情况?
最好不要使用attach以避免额外的复杂性。
attach
-------------- | 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 | ----------------------------
--------------- | id | name | --------------- | 1 | Kiwi | | 2 | Lemon | | 3 | Apple | | 4 | Orange |
---------------- | id | 名称| ---------------- | 1 | JuiceC | | 2 | JuiceD | ----------------
---------------------------- | id | juice_id | fruit_id | ---------------------------- | 1 | 1 | 1 | | 2 | 1 | 3 | | 3 | 2 | 2 | | 4 | 2 | 4 | ----------------------------
如果您不关心重复项,则可以从DB1获得最大的ID,并将其添加到DB2中的每个ID。但是,您说的name可能是唯一的,所以让我们做对吧。
name
我假设所有id列都是INTEGER PRIMARY KEY,即自动递增。
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;