van 2 tabellen 1 maken
- module_nieuws, afkomstig van een oude website, archief van 10.000 nieuwsitems
- posts, met tabellen, horende bij de nieuwe website, leeg
Hoe krijg ik deze beide tabellen samen? Kan dit met een query of moet dit handmatig omdat de nieuwe tabel nog leeg is?
In de beide tabellen komt de functie van de structuur op een aantal punten overeen, ze heten niet hetzelfde (voorbeeld: module_nieuws->publicatiedatum, posts->date). de gecombineerde tabel moet de structuur van posts hebben.
Gewijzigd op 03/08/2015 19:44:21 door Ellen Skapandi
Je wilt dus de data van een tabel A overzetten/omzetten naar een tabel B, waarbij B op sommige punten afwijkt van structuur ten opzichte van A? Waarna A opgedoekt mag worden?
klopt
als de oude situatie nog in gebruik is wil je mogelijk vantevoren wat downtime aankondigen en de site dan tijdelijk uit de lucht halen, maak dan vlak voor de conversie (zie verderop) een backup van de meest recente versie
stap 2: maak een zo volledig mogelijk ontwerp voor je nieuwe opzet en schrijf een conversiescript met heel veel verbale feedback (record 1 ok, record 2 ok, geen datum bij record 3, rare karakters bij record 4 et cetera)
stap 3: doe een of meer "dry runs" / conversietests op een test database, net zolang totdat alles in 1x goed wordt overgezet
stap 4: draai een tijdje met de nieuwe opzet op een testomgeving
stap 5: voer de conversie "voor eggies" uit (nadat je je site uit bedrijf hebt gehaald en nadat je een backup hebt gemaakt)
stap 5.1: maak het conversiescript onklaar of verwijder deze
stap 6: ruim je oude zut op den duur op als blijkt dat alles naar behoren werkt (maar bewaar je backup)
zoiets lijkt mij redelijk failsafe
Maar ik heb geen idee HOE ik de 2 tabellen zou moeten samenvoegen..
Wil je de oude data omzetten naar de nieuwe gegevens of wil je beide tabellen combineren.
In het eerste geval:
Code (php)
1
2
2
INSERT INTO nieuwe_tabel (kolom_n1, kolom_n2, kolom_n3)
SELECT kolom_o1, kolom_o2, kolom_o3 FROM oude_tabel
SELECT kolom_o1, kolom_o2, kolom_o3 FROM oude_tabel
In het laatste geval:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
SELECT kolom_n1, kolom_n2, kolom_n3
FROM nieuwe_tabel
UNION
SELECT kolom_o1, kolom_o2, kolom_o3
FROM oude_tabel
FROM nieuwe_tabel
UNION
SELECT kolom_o1, kolom_o2, kolom_o3
FROM oude_tabel
Waarbij je rekening moet houden dat het resultaat de kolomnamen uit de eerste select heeft.
Gewijzigd op 04/08/2015 09:25:35 door Ger van Steenderen
(gaat om
nieuwe_tabel.post_title en oude_tabel.titel
nieuwe_tabel.post_date en oude_tabel.timestamp_publiceren
nieuwe_tabel.post_name en oude_tabel.google_url
nieuwe_tabel.post_content en oude_tabel.inhoud
nieuwe_tabel.post_excerpt en oude_tabel.inhoud_kort)
Daarnaast zijn er in beide databases nog tabellen die behouden moeten worden, dus optie 2 zou het beste zijn. Maar dat werkt niet, omdat de ene database geen entry's heeft en de andere 10.000. Ik krijg een melding "The used SELECT statements have a different number of columns" terug
Met UNION moeten in beide selects hetzelfde aantal kolommen staan, dus is het handigste om geen SELECT * te gebruiken, maar de kolommen te benoemen.
Ik zet meestal de SELECT met de meeste kolommen eerst, de twee SELECT vul je dan aan met 'literals':
Ik heb in de oude database nog een aantal tabellen staan die ik wel wil gehouden.
Een SELECT selecteert alleen de informatie. Als alles naar behoren werkt, en je 100% zeker bent dat alles overgezet is verwijder je zelf de data uit de oude database. Altijd aan te raden om het nog even een paar weken aan te zien of alles goed is verlopen.
nieuwe_tabel.post_title en oude_tabel.titel
nieuwe_tabel.post_date en oude_tabel.timestamp_publiceren
nieuwe_tabel.post_name en oude_tabel.google_url
nieuwe_tabel.post_content en oude_tabel.inhoud
nieuwe_tabel.post_excerpt en oude_tabel.inhoud_kort