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

Come unire due dati di database identici in uno?

Dici che entrambi i clienti stanno usando la tua applicazione, quindi presumo che sia una specie di software "retraibile" utilizzato da più clienti oltre a questi due, giusto?

Se sì, l'aggiunta di colonne speciali alle tabelle o qualcosa del genere probabilmente causerà problemi in futuro, perché dovresti mantenere una versione speciale per questi due clienti in grado di gestire le colonne aggiuntive. Oppure dovresti introdurre queste colonne nella tua base di codice principale, il che significa che anche tutti gli altri tuoi clienti le riceverebbero.

Posso pensare a un modo più semplice per farlo senza modificare nessuna delle tue tabelle o aggiungere colonne.
Affinché funzioni, devi scoprire l'ID più grande che esiste in entrambi i database insieme ( non importa in quale tabella o in quale database si trovi) .

Potrebbe essere necessario copiare e incollare per ottenere molte query simili a questa:

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

Quando trovi l'ID più grande dopo aver eseguito la query in entrambi i database, prendere un numero maggiore di tale ID e aggiungerlo a tutti gli ID in tutte le tabelle nel secondo database.
È molto importante che il numero deve essere maggiore dell'ID più grande già esistente in entrambi i database!

È un po' difficile da spiegare, quindi ecco un esempio:

Diciamo che l'ID più grande in qualsiasi tabella in entrambi i database è 8000 .
Quindi esegui dell'SQL che aggiunge 10000 a ogni ID in ogni tabella nel secondo database :

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

Le query sono relativamente semplici, ma questa è la più faticosa perché devi creare una query come questa manualmente per ogni tabella nel database, con i nomi corretti di tutte le colonne ID.

Dopo aver eseguito la query sul secondo database, i dati di esempio della tua domanda avranno questo aspetto:

Database 1: (esattamente come prima)

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

E questo è tutto! Ora puoi importare i dati da un database all'altro, senza subire alcuna violazione della chiave primaria.