gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 13:02:16 37 4
gpt4 key购买 nike

我有几个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/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com