Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да обединим две идентични данни от база данни в една?

Казвате, че и двамата клиенти използват вашето приложение, така че предполагам, че това е някакъв вид софтуер за „свиване“, който се използва от повече клиенти, отколкото само от тези двама, нали?

Ако да, добавянето на специални колони към таблиците или нещо подобно вероятно ще причини болка в бъдеще, защото ще трябва да поддържате специална версия за тези два клиента, която може да се справи с допълнителните колони. Или ще трябва да въведете тези колони в основната си кодова база, което означава, че всичките ви други клиенти също ще ги получат.

Мога да измисля по-лесен начин да направите това, без да променяте нито една от таблиците си или да добавяте колони.
За да работи това, трябва да откриете най-големия идентификатор, който съществува в двете бази данни заедно ( без значение в коя таблица или в коя база данни е) .

Това може да изисква копиране и поставяне, за да получите много заявки, които изглеждат така:

select max(id) as maxlocationid from locations
select max(id) as maxpersonid from persons
-- and so on... (one query for each table)

Когато намерите най-големия идентификатор след изпълнение на заявката в двете бази данни, вземете число, което е по-голямо от този идентификатор, и го добавете към всички идентификатори във всички таблици във втората база данни.
Много е важно числото трябва да е по-голям от най-големия идентификатор, който вече съществува в двете бази данни!

Малко е трудно за обяснение, така че ето един пример:

Да кажем, че най-големият идентификатор във всяка таблица в двете бази данни е 8000 .
След това изпълнявате някакъв SQL, който добавя 10000 към всеки идентификатор във всяка таблица във втората база данни :

update Locations set Id = Id + 10000
update Persons set Id = Id + 10000, LocationId = LocationId + 10000
-- and so on, for each table

Заявките са сравнително прости, но това е най-голямата работа, защото трябва да създадете заявка като тази ръчно за всяка таблица в базата данни, с правилните имена на всички колони с ИД.

След като стартирате заявката във втората база данни, примерните данни от вашия въпрос ще изглеждат така:

База данни 1: (точно както преди)

Locations :

Id    Name         Adress   etc....
1     Location 1
2     Location 2

Persons :

Id    LocationId     Name     etc...
1     1              Alex
2     1              Peter
3     2              Lisa

База данни 2:

Locations :

Id    Name         Adress   etc....
10001 Location A
10002 Location B

Persons :

Id    LocationId     Name     etc...
10001 10001          Mark
10002 10002          Ashley
10003 10001          Ben

И това е! Сега можете да импортирате данните от една база данни в друга, без изобщо да получавате нарушения на първичния ключ.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Блокировка от заключване на обхват на индекс на първичен ключ

  2. Комбиниране на множество условия в оператор за един случай в Sql Server

  3. sql сървър 4 байта unsigned int

  4. Трябва ли да използвам тип данни SQL_Variant?

  5. Сравнете стойностите на датата между 3 колони в SQL Server и изтеглете информация за активи в SQL Server