我有两个SQLite数据库,它们都有连接表来描述一对多关系。现在这两个DB需要合并为一个具有某种导入/导出机制的数据库,并且仍然保持关系。
我尝试使用.dump
转储 DB2 ,然后使用.read
将其加载回 DB1 ,但总是得到PRIMARY KEY must be unique
警告。
有没有最好的做法来处理这种情况?
首选不要使用attach
来避免额外的复杂性。
-------------- | 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 | ----------------------------
--------------- | 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 | ----------------------------
答案 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;