【问题标题】:Merging two SQLite databases which both have junction tables合并两个都有联结表的 SQLite 数据库
【发布时间】:2013-11-14 03:14:21
【问题描述】:

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

我尝试使用.dump 转储DB2,然后使用.read 将其加载回DB1,但总是收到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 | ----------------------------

【问题讨论】:

  • names 是否唯一,合并后它们是否应该保持唯一?
  • 如果ATTACH 的复杂性更少,您愿意使用它吗?
  • name 可以是唯一的,也可以不是唯一的,重要的是保持联结表的关系并解决主键冲突问题。对我来说使用attach 就像操作两个子数据库而不是一个子数据库。欢迎提出任何建议。
  • 那么你可以吃两种不同的水果“苹果”吗?
  • 是的,我没关系。

标签: sql database sqlite


【解决方案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;

【讨论】:

  • 如果DB1DB2 中的水果顺序不同,如原问题中的示例,该怎么办?
  • 然后ID会改变。 (这就是这些子查询的全部目的。)
猜你喜欢
  • 1970-01-01
  • 2011-05-31
  • 2021-11-21
  • 1970-01-01
  • 2018-10-16
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
相关资源
最近更新 更多