sql >> Databáze >  >> RDS >> Sqlserver

Jak sloučit dvě identická data databáze do jednoho?

Říkáte, že vaši aplikaci používají oba zákazníci, takže předpokládám, že jde o nějaký druh softwaru „smršťovací fólie“, který používá více zákazníků než jen tito dva, že?

Pokud ano, přidání speciálních sloupců do tabulek nebo něco podobného pravděpodobně v budoucnu způsobí bolest, protože pro tyto dva zákazníky byste museli udržovat speciální verzi, která si poradí s dalšími sloupci. Nebo byste museli tyto sloupce zavést do své hlavní kódové základny, což znamená, že by je dostali i všichni vaši ostatní zákazníci.

Napadá mě jednodušší způsob, jak to udělat, aniž bych měnil jakoukoli z vašich tabulek nebo přidával sloupce.
Aby to fungovalo, musíte zjistit největší ID, které existuje v obou databázích dohromady ( bez ohledu na to, ve které tabulce nebo v jaké databázi se nachází) .

To může vyžadovat nějaké zkopírování a vložení, abyste získali mnoho dotazů, které vypadají takto:

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

Když po spuštění dotazu v obou databázích najdete největší ID, vezměte číslo, které je větší než toto ID, a přidejte ho ke všem ID ve všech tabulkách v druhé databázi.
Je velmi důležité, aby číslo musí být větší než největší ID, které již v obou databázích existuje!

Je to trochu obtížné vysvětlit, takže zde je příklad:

Řekněme, že největší ID v jakékoli tabulce v obou databázích je 8000 .
Pak spustíte nějaké SQL, které přidá 10000 ke každému ID v každé tabulce v druhé databázi :

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

Dotazy jsou relativně jednoduché, ale to je nejpracnější, protože takovýto dotaz musíte sestavit ručně pro každou tabulku v databázi se správnými názvy všech sloupců ID.

Po spuštění dotazu na druhou databázi budou ukázková data z vaší otázky vypadat takto:

Databáze 1: (přesně jako předtím)

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

Databáze 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

A to je vše! Nyní můžete importovat data z jedné databáze do druhé, aniž by došlo k jakémukoli porušení primárního klíče.



  1. org.hibernate.MappingException:Žádné mapování dialektů pro typ JDBC:1111

  2. Oracle SEQUENCE – 'přírůstek o' a 'mezipaměť'

  3. Jak importuji moduly nebo instaluji rozšíření v PostgreSQL 9.1+?

  4. Existuje způsob, jak získat přístup k hodnotě předchozího řádku v příkazu SELECT?