Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
合并两个都有连接表的SQLite数据库_Sql_Database_Sqlite - Fatal编程技术网

合并两个都有连接表的SQLite数据库

合并两个都有连接表的SQLite数据库,sql,database,sqlite,Sql,Database,Sqlite,我有两个SQLite数据库,它们都有连接表来描述一对多关系。现在,这两个数据库需要通过某种导入/导出机制合并为一个数据库,并且仍然保持关系 我尝试使用转储DB2。转储,然后使用将其加载回DB1。读取,但始终得到主键必须是唯一的警告 有没有处理这种情况的最佳做法 最好不要使用attach,以避免额外的复杂性 DB1 果 -------------- |id |名称| -------------- |1 |苹果| |2 |柠檬| |3 |猕猴桃| -------------- 果汁 -------

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

我尝试使用
转储DB2。转储
,然后使用
将其加载回DB1。读取
,但始终得到
主键必须是唯一的
警告

有没有处理这种情况的最佳做法

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


DB1 果 -------------- |id |名称| -------------- |1 |苹果| |2 |柠檬| |3 |猕猴桃| -------------- 果汁 ---------------- |id |名称| ---------------- |1 |果汁A| |2 |果汁B| ---------------- 配方(连接表) ---------------------------- |id |果汁|水果| id| ---------------------------- | 1 | 1 | 1 | | 2 | 1 | 2 | | 3 | 2 | 1 | | 4 | 2 | 3 | ----------------------------
DB2 果 --------------- |id |名称| --------------- |1 |猕猴桃| |2 |柠檬| |3 |苹果| |4 |橙色| --------------- 果汁 ---------------- |id |名称| ---------------- |1 |果汁C| |2 |果汁D| ---------------- 配方(连接表) ---------------------------- |id |果汁|水果| id| ---------------------------- | 1 | 1 | 1 | | 2 | 1 | 3 | | 3 | 2 | 2 | | 4 | 2 | 4 | ----------------------------
如果您不关心重复项,那么可以从DB1获得最大ID,并将其添加到DB2中的每个ID中。
但是,您说过,
name
可能是唯一的,所以让我们正确地执行此操作

我假设所有
id
列都是
INTEGER主键
,即自动递增

打开DB1并连接DB2:

ATTACH '...' AS db2;
复制DB1中尚未存在的所有水果和果汁(这些将获得新ID):

现在复制配方,同时通过相应的名称查找新的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;

name
s是唯一的吗?合并后它们是否应该保持唯一?如果
ATTACH
减少了复杂性,您愿意使用它吗?
name
是否唯一,重要的是保持连接表的关系并解决主键冲突问题。对我使用
attach
就像操作两个子数据库,而不是一个子数据库。欢迎您提出任何建议。那么您可以选择两种不同的水果“Apple”?是的,我也可以。如果水果在
DB1
DB2
中的顺序不同,如原始问题中的示例,该怎么办?然后ID会改变。(这是这些子查询的全部目的。) ---------------------------- | 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 | ----------------------------
ATTACH '...' AS db2;
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);
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;