3

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

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

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

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


DB1

水果

--------------
| 编号 | 姓名 |
--------------
| 1 | 苹果 |
| 2 | 柠檬 |
| 3 | 猕猴桃 |
--------------

果汁

----------------
| 编号 | 姓名 |
----------------
| 1 | 果汁A |
| 2 | 果汁B |
----------------

配方(连接表)

----------------------------
| 编号 | 果汁_id | 水果ID |
----------------------------
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 1 |
| 4 | 2 | 3 |
----------------------------

DB2

水果

---------------
| 编号 | 姓名 |
---------------
| 1 | 猕猴桃 |
| 2 | 柠檬 |
| 3 | 苹果 |
| 4 | 橙色 |
---------------

果汁

----------------
| 编号 | 姓名 |
----------------
| 1 | 果汁C |
| 2 | 果汁D |
----------------

配方(连接表)

----------------------------
| 编号 | 果汁_id | 水果ID |
----------------------------
| 1 | 1 | 1 |
| 2 | 1 | 3 |
| 3 | 2 | 2 |
| 4 | 2 | 4 |
----------------------------
4

1 回答 1

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;
于 2013-11-15T09:15:56.220 回答