sql - 在SQLite中合并具有关系的多个数据库

标签 sql sqlite

我有几个sqlite文件(数据库),它们的结构很简单,例如:

  | Id | Category |                                | Id | CatId | Name |
  -----------------                                ---------------------
  | 1  |     A    |                                | 1  |   2   |  A   |
  -----------------  -- relations one to many  --> ---------------------
  | 2  |     B    |                                | 2  |   1   |  B   |
                                                   ---------------------
                                                   | 3  |   2   |  BC  |


因此,如您所见,其中有一个表,其中女巫与姓名禁忌有关。问题是我有几个sutrch文件,我想将它们合并为一个并保持关系。

因此,合并第一个表很简单,例如:

ATTACH DATABASE '{databaseFilePath}' AS Db;

BEGIN;
INSERT INTO Category (Category) SELECT Category FROM Db.Category;
COMMIT;

DETACH DATABASE Db;


但这会更改我的ID(将其设置为autoincrement,因为在许多数据库文件中可以具有相同的ID)。现在,我可以对第二个具有名称的表执行相同的操作,问题在于保持关系,因为主表已更改。有什么合理的方法可以做到这一点吗?

这是创建表:

CREATE TABLE Category (Id INTEGER PRIMARY KEY NOT NULL UNIQUE,Category STRING);
INSERT INTO Category (Category, Id) VALUES ('B', 2), ('A', 1);

CREATE TABLE Name (Id INTEGER PRIMARY KEY UNIQUE NOT NULL, 
CatId INTEGER 
REFERENCES Category (Id) ON DELETE CASCADE ON UPDATE CASCADE MATCH SIMPLE, Name  STRING);
INSERT INTO Name (Name,CatId,Id)VALUES ('A',1,1),('AB',1,3 ),('B',2,2);

最佳答案

我相信您可以基于以下内容(为了方便起见,在第二个表名的后面附加了2,而不是附加数据库),另外,在第二个表集的数据前面加上了C2。

DROP TABLE IF EXISTS Name;
DROP TABLE IF EXISTS Name2;
DROP TABLE IF EXISTS Category;
DROP TABLE IF EXISTS Category2;

CREATE TABLE Category (Id INTEGER PRIMARY KEY NOT NULL UNIQUE,Category STRING);
INSERT INTO Category (Category, Id) VALUES ('B', 2), ('A', 1);

CREATE TABLE Name (Id INTEGER PRIMARY KEY UNIQUE NOT NULL, 
CatId INTEGER 
REFERENCES Category (Id) ON DELETE CASCADE ON UPDATE CASCADE MATCH SIMPLE, Name  STRING);
INSERT INTO Name (Name,CatId,Id)VALUES ('A',1,1),('AB',1,3 ),('B',2,2);

CREATE TABLE Category2 (Id INTEGER PRIMARY KEY NOT NULL UNIQUE,Category STRING);
INSERT INTO Category2 (Category, Id) VALUES ('C2B', 2), ('C2A', 1);

CREATE TABLE Name2 (Id INTEGER PRIMARY KEY UNIQUE NOT NULL, 
CatId INTEGER 
REFERENCES Category2 (Id) ON DELETE CASCADE ON UPDATE CASCADE MATCH SIMPLE, Name  STRING);
INSERT INTO Name2 (Name,CatId,Id)VALUES ('C2A',1,1),('C2AB',1,3 ),('C2B',2,2);

UPDATE Category2 SET id = id + (Max((SELECT max(id) FROM Category),(SELECT max(id) FROM Category2)));
UPDATE Name2 SET id = id + (Max((SELECT Max(id) FROM name) ,(SELECT max(id) FROM name2)));

SELECT * FROM Category2;
SELECT * FROM Name2;
INSERT INTO Category SELECT * FROM Category2 WHERE 1;
INSERT INTO name SELECT * FROM name2 WHERE 1;
SELECT * FROM Category;
SELECT * FROM Name;



请注意,您提到了AUTOINCREMENT,但尚未将其包括在内,因此未包括检查最高的sqlite_sequence值。
上面的内容依赖于CASCADE UPDATE,将增加的Category.id向下层叠到CatId。


通过找到具有相同模式的两个表的最高ID,然后通过将找到的最高ID添加到所有行的ID中来更新要合并的表的ID,可以进行工作。当表是“类别”表时,更新的ID将级联到相应的“名称”表。

对一对类别表和一对名称表都执行该过程。

结果(最后一个查询是):

enter image description here

关于sql - 在SQLite中合并具有关系的多个数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56180784/

相关文章:

mysql - 将双重嵌套查询转换为 JOIN 语句,以及其他优化

android - 使用 SQLite 将数据从一个 Activity 传输到另一 Activity : Android Studio

sqlite - SQLite源代码parse.y-nm

sql - 选择 COUNT() 函数时如何连接 SQL 表?

mysql - MySQL 会忽略 LEFT JOIN 子句中的 AND 吗?

MYSQL 更新错误,但我没有看到错误

android - 在sqlite中运行时创建数据库表

android - 数据库同步替代方案

sql - PostgreSQL 子项目总数量

mysql inner join 给出不好的结果(?)