我有两个 SQLite 数据库,它们都有连接表来描述一对多关系。现在,这两个数据库需要通过某种导入/导出机制合并为一个数据库,并仍然保留关系。
我试图转储DB2 with .dump
然后将其加载回DB1 with .read
,但总是得到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 |
----------------
配方(接线表)
----------------------------
| 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 |
----------------
配方(接线表)
----------------------------
| id | juice_id | fruit_id |
----------------------------
| 1 | 1 | 1 |
| 2 | 1 | 3 |
| 3 | 2 | 2 |
| 4 | 2 | 4 |
----------------------------
如果您不关心重复项,您可以从 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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)