Слияние нескольких баз данных с отношениями в SQLite - PullRequest
1 голос
/ 17 мая 2019

У меня есть пара sqlite-файлов (баз данных) с довольно простой структурой, такой как:

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

Итак, как вы видите, есть таблица с категориями, которая связана с именем tabe. Проблема в том, что у меня есть несколько файлов sutrch, и я хочу объединить их в один и сохранить отношения.

Таким образом, объединение первой таблицы просто, как:

ATTACH DATABASE '{databaseFilePath}' AS Db;

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

DETACH DATABASE Db;

Но это изменит мой идентификатор (он установлен на автоинкремент, потому что во многих файлах БД могут быть одинаковые идентификаторы). Теперь я могу сделать то же самое для второй таблицы с именами, проблема в том, чтобы сохранить связь, поскольку основной изменился. Есть ли рациональный способ сделать это?

Вот создание таблиц:

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);

1 Ответ

1 голос
/ 17 мая 2019

Я полагаю, что вы могли бы основать это на следующем (вместо присоединения базы данных, 2 был добавлен ко 2-му набору имен таблиц (для удобства), кроме того, к данным был добавлен префикс C2 для 2-го набора таблиц).): -

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 В ОБНОВЛЕНИИ, для каскадного увеличения значения Category.id вплоть до CatId.

Это работает путем нахождения наибольшего идентификатора обеих таблиц с одинаковой схемой и последующего обновления идентификаторов таблицы добыть объединены путем добавления найденного наибольшего идентификатора к идентификаторам всех строк.Когда таблицы являются таблицей категорий, обновленные идентификаторы каскадно добавляются к соответствующей таблице имен.

Процесс выполняется как для пары таблиц категории, так и для пары таблиц имен.

Результат(последний запрос): -

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...