Entrambi i database hanno lo stesso schema, ma potrebbero verificarsi conflitti con la chiave primaria in alcune tabelle. Quindi voglio che ignorino semplicemente le righe duplicate e continuiamo a fonderci ulteriormente.Come unire due database in SQL Server?
risposta
Prima un conflitto di chiavi indica che qualsiasi processo che si sta utilizzando attualmente è scadente.
Per unire correttamente due database che utilizzano chiavi autogenerate (non_GUID), è necessario eseguire diversi passaggi. Per prima cosa aggiungi una nuova chiave generata automaticamente alla tabella genitore, quindi importa tutti i dati da entrambe le tabelle, rinomina il vecchio vecchio file in ID_old e rinomina i nuovi file con il vecchio nome id. A questo punto puoi quindi spostarti sulle tabelle figlio. Sarà necessario copiare le tabelle figlio collegandosi alla tabella padre e prendendo il nuovo campo ID come valore per la chiave esterna anziché quella nella tabella esistente. Sarà necessario ripetere questa procedura per ogni tabella di chiavi esterne e se tale tabella è anche una tabella padre, sarà necessario aggiungere il campo conversionid alla tabella prima di copiare qualsiasi dato, in modo da poter lavorare fino in fondo alla catena . Per fare ciò, è necessaria una buona dose di conoscenza della struttura del database e molta pianificazione. Non considerare di farlo senza un buon backup di entrambi i database di origine. È anche meglio se il processo può accadere quando entrambe le basi sono in modalità utente singolo.
Se si utilizzano chiavi naturali e duplicati, si presenta un problema molto diverso. Tutti i record di chiavi duplicati dovrebbero essere spostati in una tabella separata prima e una deteminazione su quali sono i dati più corretti dovrebbero essere fatti. In alcuni casi scoprirai che la chiave naturale non è in effetti unica (raramente lo sono, motivo per cui quasi non li uso) e il database unito dovrà funzionare con una chiave autogenerata di qualche tipo. Ciò comporterà modifiche al codice e modifiche al database, quindi è l'opzione di ultima istanza.
Quello che si trova spesso con le chiavi naturali è che i dati per ognuno sono diversi ma simliar (St. vice Street nell'indirizzo) in questo caso contrassegnare uno dei record per l'inserimento e quindi quando fare l'inserimento in due passaggi , prima i record che non hanno duplicati, quindi i record nella tabella dei duplicati che sono contrassegnati per l'inserimento. Ricorda che dovrai esaminare tutti i record in tutte le tabelle di chiavi straniere per stabilire quale mantenere e quale non mantenere. Eliminare qualsiasi duplicato è una cattiva idea e perderete i dati in quel modo, possibilmente dati importanti (come gli ordini di un cliente). Questo è un processo lungo e noioso che richiederà a qualcuno con esperienza nei dati di effettuare le determinazioni. Come programmatore, dovresti fornire loro uno strumento di deduplica che consentirà loro di esaminare tutti i dati per ciascun set di duplicati e scegliere cosa tenere e cosa eliminare e quindi aver segnato tutto, eseguirà un processo per inserire i record . Ricordatevi che per i veri duplicati ci saranno alcune tabelle figlio (come gli ordini) che hanno bisogno dei record sia inviati al database per il record scelto come quello da inserire (gli ordini sono un esempio), per le altre tabelle vorrete scegliere quale sia corretto (indirizzo per esempio). Quindi puoi vedere che questo è un processo complesso che richiede una comprensione approfondita del database.
Se si dispone di molti duplicati, è possibile che si stiano ripulendo e aggiungendo i dati per diversi mesi, quindi uno strumento è davvero fondamentale. Le persone che fanno questo saranno probabilmente utenti di sistema non specialisti di database o programmatori in quanto sono le uniche persone che possono veramente esprimere il giudizio sulla maggior parte dei itme su quale record tenere. Probabilmente avrete bisogno di fare qualcosa di simile in ogni caso in quanto potrebbero esserci dei record che sono duplicati anche quando avete una chiave generata automaticamente. Sono solo più difficili da trovare.
Non esiste un modo semplice per unire due database (anche utilizzando GUID, si ha il problema dei duplicati nella chiave naturale).
La migliore scommessa sarebbe probabilmente disponibile con un'applicazione di terze parti come RedGate SQL Data Compare. Costa un po 'di soldi, ma ne vale la pena rispetto alla scrittura di questo script IMO.
Se si dispone di chiavi primarie come IDENTITY, ecco il mio suggerimento (non dovrebbe richiedere la modifica dello schema).
- Impostare tutte le chiavi esterne in modo che
ON UPDATE CASCADE
è impostato - aggiornare la chiave/IDENTITÀ campo primaria nella tabella padre e aggiungere il valore massimo del campo della tabella corrispondente che si sta per fondersi (la FKS poi a cascata i valori alle tabelle figlio)
- fare lo stesso per i campi PK/identità nella tabelle figlio
- seguire il suggerimento da this forum answer e utilizzare
SET IDENTITY_INSERT
ON/OFF entrambi i lati di Inserimento ognuna delle tabelle, iniziando dalla tabella padre e passando poi alle tabelle figlio
So che questo è un vecchio argomento ma devo commentare l'approccio generale che vedo in molti post e che sta cercando di fare tutto in modo nativo usando le query SQL. Ciò che tali soluzioni hanno in comune è la quantità di tempo abbastanza grande che deve essere spesa per creare e testare una query prima di applicarla.
Quindi sì, è possibile unire due database in modo nativo utilizzando query relativamente complesse ma è possibile risparmiare un sacco di tempo e utilizzare strumenti di terze parti gratuitamente (la maggior parte o tutti hanno una prova gratuita completamente funzionale).
Ci sono tonnellate di questi sul mercato. Red Gate, già menzionato in altri post, è uno dei migliori ma puoi anche provare ApexSQL Data Diff, dbForge, SQL Comparison toolset e molti altri.
Si potrebbe semplicemente aggiungere un campo aggiuntivo (denominato DatabaseID ad esempio) a tutte le tabelle nel database unito e aggiungerlo alle chiavi primarie. In questo modo è possibile mantenere le chiavi originali, pur avendo chiavi univoche nel database unito, e si può sapere da quale database è arrivata la riga. Questo è ciò che fa SQL-Hub - se si tratta di un lavoro singolo, puoi farlo con la versione di prova gratuita.
Ecco come ho fatto per due volte negli ultimi anni: http://byalexblog.net/merge-sql-databases
- 1. Come unire i risultati di due query in SQL Server?
- 2. Unire due file in SQL
- 3. Confronto di due schemi di database SQL Server in C#
- 4. Posso unire i dati da 2 diversi database DB2? (Come database collegati a SQL Server)
- 5. Come unire due righe in una riga in sql?
- 6. MongoDB: come unire due collezioni/database in uno?
- 7. Come rilasciare più database in SQL Server
- 8. Unire due sottoquery in MySQL
- 9. SQL Unire due tabelle senza relazioni
- 10. come sottrarre due volte in sql server?
- 11. Elimina database SQL Server
- 12. Come unire due oggetti?
- 13. Come proteggere un database dall'amministratore del server in Sql Server
- 14. Come "unire" due URI in Java?
- 15. Database locale senza server sql
- 16. sql per unire due tabelle non correlate in un unico
- 17. modo corretto di selezionare da due tabelle in SQL Server senza campo comune per unire il
- 18. Unire due ordinari RDD con/senza Spark SQL
- 19. Moltiplicazione di due colonne in SQL Server
- 20. Unisci due tabelle in SQL Server 2008
- 21. Script intero database SQL-Server
- 22. INSERT XML in database SQL Server
- 23. Database SQL Server 2005 'In Recovery'
- 24. Come ripristinare il database da MDF in SQL Server 2005?
- 25. Differenza di due date in sql server
- 26. Come unire due account github
- 27. XCode: come unire due linee?
- 28. Come confrontare i dati tra due tabelle in diversi database usando Sql Server 2008?
- 29. Unire due oggetti in php
- 30. Unire due liste in Haskell
è che non c'è alcuna alternativa open source !!! – Ish