sql >> Database teknologi >  >> RDS >> Sqlserver

Hvordan flettes to identiske databasedata til én?

Du siger, at begge kunder bruger din applikation, så jeg går ud fra, at det er en form for "krympe-indpakning"-software, der bruges af flere kunder end blot disse to, ikke?

Hvis ja, vil tilføjelse af specielle kolonner til tabellerne eller noget lignende sandsynligvis forårsage smerte i fremtiden, fordi du enten skulle opretholde en speciel version for disse to kunder, der kan håndtere de ekstra kolonner. Eller du bliver nødt til at introducere disse kolonner til din hovedkodebase, hvilket betyder, at alle dine andre kunder også ville få dem.

Jeg kan komme i tanke om en nemmere måde at gøre dette på uden at ændre nogen af ​​dine tabeller eller tilføje nogen kolonner.
For at dette kan fungere, skal du finde ud af det største ID, der findes i begge databaser sammen ( uanset i hvilken tabel eller i hvilken database det er) .

Dette kan kræve noget copy &paste for at få en masse forespørgsler, der ser sådan ud:

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

Når du finder det største id efter at have kørt forespørgslen i begge databaser, skal du tage et tal, der er større end det id, og tilføje det til alle id'er i alle tabeller i den anden database.
Det er meget vigtigt, at antallet skal være større end det største ID, der allerede findes i begge databaser!

Det er lidt svært at forklare, så her er et eksempel:

Lad os sige, at det største ID i enhver tabel i begge databaser er 8000 .
Så kører du noget SQL, der tilføjer 10000 til hvert ID i hver tabel i den anden database :

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

Forespørgslerne er relativt enkle, men det er det største arbejde, fordi du skal bygge en forespørgsel som denne manuelt for hver tabel i databasen med de korrekte navne på alle ID-kolonner.

Efter at have kørt forespørgslen på den anden database, vil eksempeldataene fra dit spørgsmål se sådan ud:

Database 1: (præcis som før)

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

Database 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

Og det er det! Nu kan du importere data fra den ene database til den anden, uden at få nogen primærnøglebrud overhovedet.



  1. Opregnede typer med ActiveRecord og Postgresql

  2. Hvornår skal man bruge mysql_real_escape_string()

  3. Datointerval overlappende kontrolbegrænsning

  4. Oracle - ingen funktion med navn X findes i dette omfang