Как устранить коллизию первичного ключа при объединении одного БД с другим - PullRequest
3 голосов
/ 25 января 2012

У меня развернуто приложение в двух разных регионах, например, в США-ЗАПАД и ЕС, оба приложения имеют свою собственную БД.А теперь я хочу переместить базу данных региона ЕС в US-WEST.

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

Сценарий: таблица пользователей из DB1 (скажем, из US-WEST) содержит следующие записи

ID Name 
1  Rob
2  San
3 Tulip

Таблица пользователей из DB2 (скажем, из ЕС) содержит следующие записи

ID Name  
1  John
2  Michael
3  Natasha

Ответы [ 4 ]

8 голосов
/ 25 января 2012
  • Для каждой из двух исходных баз данных (скажем, db0 и db1):

    • Резервное копирование базы данных.

    • Блокировка базы данных для использования только этим сценарием.

    • Для всех таблиц в базе данных, для которых внешние ключи определены без ON UPDATE CASCADE, измените все эти внешние ключиограничения с этой опцией.

    • Для каждой таблицы с auto_increment (или простым целым числом) первичным ключом выполните эту команду (каскадные обновления сделают все остальное):

.

           UPDATE TableX
           SET Pk = 2 * Pk - 0         --- for db0
           ORDER BY Pk DESC

           UPDATE TableX
           SET Pk = 2 * Pk - 1         --- for db1
           ORDER BY Pk DESC
  • Экспорт таблиц из каждой базы данных.

  • Теперь объедините две базы данных:просто объединяя соответствующие таблицы.Все данные из db0 будут иметь четные идентификаторы, а все из db1 будут иметь нечетные идентификаторы.Никаких коллизий.

  • Для таблиц без автоинкрементных первичных ключей или для таблиц, которые могут иметь общие строки, объединение должно отличаться, конечно.

  • Unlock.


Вы можете прочитать о auto_increment_increment и связанных системных переменных, которые можно изменить, поэтому с этого момента две базы данных производятразные идентификаторы с автоматическим увеличением (одни нечетные, другие четные).

1 голос
/ 25 января 2012

Я думаю, вам нужно расширить целевую БД столбцом, например regionID, и отредактировать настройки первичного ключа для этой таблицы. Используйте первичный ключ с двумя столбцами ID и regionID. Затем импортируйте данные из двух таблиц следующим образом:

Insert into destination_table values(regionID, ID, Name)
select 1,ID, Name from DB1

Insert into destination_table values(regionID, ID, Name)
select 2,ID, Name from DB2

Теперь сложная часть. Вы должны сделать это для всех таблиц, где вы используете ID как отношение. После передачи всех данных вам нужно всего лишь отредактировать операторы SQL, чтобы использовать regionID и ID в качестве ключа.

1 голос
/ 25 января 2012

Отключите автоинкремент в вашей целевой БД.Затем сначала импортируйте данные из DB1 и из DB2.При импорте из DB2 добавьте постоянное значение, которое превышает ваш самый высокий идентификатор в первой БД.Например:

insert into destination_table 
    select id + 10000, othercolumns from source_table

После импорта данных вы можете снова включить автоинкремент.

РЕДАКТИРОВАТЬ:

Если ваш столбец id ссылается на другие таблицы, тогда этот методнарушит отношение к этим таблицам.

0 голосов
/ 25 января 2012
  1. Удалите первичный ключ и отключите автоинкремент из поля id вашей целевой таблицы БД.

  2. Затем сначала импортируйте данные из обеих БД.

  3. Удалить столбец идентификатора из таблицы назначения.

  4. Создать заново столбец идентификатора, сделать этот столбец auto increament primary key.

...