Стандартный метод или лучшие практики для внешних ключей при экспорте и объединении баз данных - PullRequest
0 голосов
/ 29 мая 2019

Рекомендуется ли объединять две базы данных (с одинаковой схемой), в которых есть таблицы с внешними ключами? Я ищу способ с MySQL (или любой стандартной функцией языка SQL) экспортировать строки с заполнителем для внешнего ключа и, при импорте, вставить правильное вновь назначенное значение после строки, которая определяет внешний ключ (через автоинкремент) назначил один.

Я могу сделать это с помощью программирования вне SQL, но мне любопытно, если есть лучший подход, использующий только методы, специфичные для SQL или MySQL.

Если программирование является единственным вариантом, есть ли рекомендуемый метод (экспорт в формате JSON)? Мои попытки работают, но они не изящны, и я сам пишу все методы импорта, которые подвержены ошибкам и ошибкам.

1 Ответ

0 голосов
/ 29 мая 2019

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

ПРИМЕЧАНИЕ: это ТОЛЬКО работает, если первая таблица (та, в которой столбец идентификаторов служит внешним ключом, ТАКЖЕ имеет уникальный набор столбцов, который не является столбцом идентификаторов). Это называется " естественный ключ " (hat / tip @rd_nielsen). Надеюсь, у вас уже есть один в форме уникального индекса в первой таблице, который не является уникальным ключом.

Пример: таблица «t1» имеет столбцы id1, c1, c2, c3, c4, а таблица «t2» имеет id2, id1, d1, d2, d3, где id1 - столбец идентификаторов в t1 и внешний ключ в t2; и c1 + c2 является естественным ключом в t1.

Этот метод основан на создании временной таблицы переходов, которая заменяет внешний ключ во второй таблице на естественный ключ первой таблицы вместо столбца идентификации первой таблицы.

  1. Найти уникальную комбинацию столбцов (c1+c2 в этом примере) в первой таблице, которая является естественным ключом.

  2. Выполнить запрос соединения, который объединяет столбцы естественного ключа первой таблицы со второй таблицей; через внешний ключ; во временную таблицу.

    -- Sybase syntax.
    SELECT t1.c1, t1.c2, t2.d1, t2.d2, t2.d3
    INTO   tempdb..t2_lookupable
    WHERE  t1.id1 = t2.id1
    
    -- While at it, let's build the migratable columns (everything except identity) for t1
    SELECT t1.c1, t1.c2, t1.c3, t1.c4
    INTO   tempdb..t1_lookupable
    
  3. При необходимости клонируйте данные из таблиц tempdb..t1_lookupable и tempdb..t2_lookupable в цель.

    Это может включать в себя объединение данных из ваших двух баз данных или чего-либо еще, что необходимо сделать. Может быть bcp out / in, может быть какой-то другой метод - зависит от того, что вы делаете.

  4. Заполнение новой таблицы t1 из данных в tempdb..t1_lookupable для цели

    -- Could be a BCP
    SELECT c1, c2, c3, c4   -- id1 will get autopopulated, being an identity column
    FROM   tempdb..t1_lookupable
    
  5. Теперь самая сложная часть - заполнить новую таблицу t2 из комбинации новой таблицы t1 и таблицы t2_lookupable, найдя правильное новое значение "id1", соединив эти 2 таблицы в наборе уникальных ключей c1, c2 :

    SELECT t1.id1, t2t.d1, t2t.d2, t2t.d3
    INTO   
    FROM   t1, tempdb..t2_lookupable t2t
    WHERE  t1.c1 = t2t.c1
     AND   t1.c1 = t2t.c2
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...