Есть много баз данных с одинаковой структурой. Мне надо их слить в одну. Проблема в том что при сливе могут дублироваться id-шники (они же уникальные только в пределах одной базы) в одинаковых таблицах. И их нельзя просто заново сгенерировать insert-ом потому что на них есть ссылки из других таблиц... И таких ссылок много. Я уже замучился их мержить. Слить то не проблема union-ом, но вот с id-шниками очень сложно. Может для такой штуки уже придумано какое-то решение простое? Может я чего не знаю?
У нас подобное было. Правда мы использовали Oracle.
Так вот чтобы сохранить уникальность в разрезе БД-источника мы делали доп. поле - ID БД грубо говоря(SOURCEID). И primary делали составной(из поля ID и SOURCEID)
P.S: Также можно использовать "смещение", чтобы не добавлять отдельное поле.
К примеру
ID = 1, SOURCEID = 1;
будующий ID = 100001;
И т.д.
В качестве возможного решения.
Анализируем схему, берём на "карандаш" все связи, выявляем "кусты" (когда одно и то же значение соответствует более чем в 2 полях) и группируем. Для каждой связи подбираем такое значение delta
, прибавление которого к id
снимает проблему потенциального дублирования (ну то есть delta > MAX(main_db.table.field)-MIN(add_db.table.field)
по каждой таблице, после чего берётся максимальная delta
для всего куста связей).
Затем делается выгрузка данных из таблиц дополнительной БД в plain text с корректировкой ID-ов (как уников, так и рефералов) запросом типа
SELECT id + @delta1, field1, field2, ..., ref_field + @delta2, ...
INTO OUTFILE 'backup_tableX_filename' export_parameters
FROM add_db.tableX;
А загрузка выполняется уже без корректировки
LOAD DATA INFILE 'backup_tableX_filename' import_parameters
INTO TABLE main_db.tableX;
Просто не будет никак. У вас при проектировании никто видимо не представлял, что понадобится этот сценарий с множественными копиями и их слиянием, иначе бы задумались о какой-никакой соломке, например guid в качестве ключей или сегментации id.
Переводите потихоньку все базы с int на guid - будет проще слить воедино. Этот вариант может оказаться более выигрышным в случае если объединение будет не единоразовым.
Также мне кажется исходя из комментариев, что вам скоро может понадобится инструмент merge записей. Я например, считаю подобные вещи вообще must have в информационных системах. Например, у меня объединить дубль клиентов в системе - дело нескольких кликов (больше всего времени уходит на указание какой клиент будет 'primary' (основным, куда вливаются данные), при этом корректно объединятся контакты (тоже с дубликатами!), заказы и т.п.
В этом плане возможно вам покажется интересными статьи на хабре про dadata.ru - парни пишут толковые технические вещи про дедупликацию бизнес-данных. Ну вот например, нашлось сходу в поиске: DaData.ru находит и уничтожает одинаковых людей
Тут видите в чём фишка. Перестаньте думать о вашей задаче, как о "только SQL-запросами обойтись", не факт что получится.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
пишу мобильное приложение, которое должно получать данные из СУБД MySQL
Есть таблица, содержащая информацию про космические объекты, в частности, их тип (например, звезда, планета и тд
What are generics I am a beginner for programming I have zero about generics please explain me with examples