2011-10-30 3 views
0

У меня есть две базы данных, которые я хотел бы объединить. Оба они имеют одну и ту же схему. Вторая база данных начиналась с тех же данных, что и первая, но они расходились в определенную дату.Объединение баз данных SQL с конфликтующими идентификаторами

Проблема в том, что идентификаторы для некоторых таблиц продолжали автоматически увеличиваться с одной и той же точки, так что обе таблицы используют одинаковые идентификаторы для разных данных. Следует также упомянуть, что идентификаторы используются в качестве внешних ключей в других таблицах.

Я думал, что могу просто добавить значение для каждого идентификатора во второй базе данных, чтобы удалить конфликты. Это приемлемый способ сделать это. Если да, то как лучше всего это сделать. Если нет, то что было бы лучше.

+0

Надеюсь, вы знаете идентификаторы, которые у вас были до клонирования, так как этот первоначальный идентификатор не должен изменяться – regilero

ответ

3

Вы можете добавить смещение для первичных и внешних ключевых значений всех таблиц, заботясь о том,

  1. база данных находится в автономном режиме и не принимает изменения
  2. вы не пропустите ни одного первичного или внешнего ключа поля
  3. вы, очевидно, повсеместно добавляете одинаковое смещение.

Пример обновляет заявления:

UPDATE parent_tbl SET primary_key_col = primary_key_col + 5000; 
UPDATE child_tbl SET foreign_key_col = foreign_key_col + 5000; 
... 
... 
UPDATE parent_tbl_99 SET primary_key_col = primary_key_col + 5000; 
UPDATE child_tbl SET_99 foreign_key_col = foreign_key_col + 5000; 

Это тот случай, когда создание ваши внешние ключи с опцией ON UPDATE CASCADE были бы очень полезны. Вам только пришлось бы изменять столбцы первичного ключа, а изменения распространялись бы на таблицы, ссылающиеся на них как на внешние ключи.

FOREIGN KEY (localcol) REFERENCES parent_tbl (parent_col) ON UPDATE CASCADE 
1

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

Это может быть обобщено на объединение большего количества баз данных. Например, для трех баз данных необходимо иметь кратные три, нужно умножить на 1, а последнее - на +2.

Смежные вопросы