Als in je MySQL-server de 'federated' storage engine aanstaat (staat niet standaard aan), kun je dit heel eenvoudig met federated tables oplossen. Een federated table is een tabel die op je lokale server staat, maar die de data van een remote server haalt. Omdat de federated table een lokale tabel is, kun je de inhoud heel eenvoudig kopiëren naar een andere tabel.
Stel dat je table 'remotetable' van 'remotehost' wilt kopiëren naar "localtable" op "localhost", dan volg je ongeveer deze stappen:
1) Op remotehost vraag je op hoe de tabel is aangemaakt: "SHOW CREATE TABLE remotetable". Je krijgt dan iets als
Op basis van deze query kun je een federated table aanmaken op "localhost". De tabeldefinitie moet in principe exact gelijk zijn. De tabelnaam mag je wel wijzigen en de engine moet sowieso gewijzigd worden.
2) Maak de benodigde wijzigingen aan query en maak de federated table aan:
Als username en password moet je de gebruikersnaam van de remote server gebruiken.
3) Je kan nu de tabel kopiëren:
INSERT INTO localtable SELECT * FROM federatedtable;
(hierbij ga ik ervan uit dat localtable dezelfde tabeldefinitie heeft als remotetable)
In principe, als je alleen maar wilt kunnen joinen met een remote tabel, hoef je de kopieerslag niet eens uit te voeren en kun je de federated table gewoon gebruiken in je queries. Let in dat geval wel op de haken en ogen (zie documentatie).
> // set to 'NULL' if field is NULL field with empty value
Strict gezien klopt dit niet. NULL betekent: deze waarde bestaat niet (of het is niet bekend of de waarde bestaat). Een lege waarde betekent: deze waarde bestaat en is leeg.
> // group SQL inserts with 50 <-- better for large tables
Met zulke kleine chunks vraag ik me af of het niet juist slechter is. ;-) Het opbouwen van een query door de server geeft overhead, en 50 records is best weinig voor MySQL. Je kan zonder problemen opschalen naar 1000 records of zelfs nog meer. In de praktijk pomp ik data soms met een miljoen records tegelijk over. Dat duurt weliswaar zo'n anderhalve minuut, maar ik heb nog nooit gemerkt dat MySQL daar moeite mee heeft.
NULL in sql is we zullen het nooit weten.
Het probleem is dat in de dataset een lege string krijgt bij kolommen die geen waarde hebben.
Bij niet numerieke en niet date(time) datatypes kan je nooit zeker weten of de kolom geen waarde bevat of een lege string (dat is in SQL een waarde)