[MySQL] Identieke databases mergen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • DutchAddick
  • Registratie: December 2002
  • Laatst online: 05-08 17:59
Ik heb twee qua structuur identieke MySQL databases, maar met verschillende data erin.
Nu wil ik die samenvoegen, maar is daar een handige manier voor, want handmatig doen is een drama vanwege de dubbele primary en foreign key waarden.

Acties:
  • 0 Henk 'm!

  • pistole
  • Registratie: Juli 2000
  • Laatst online: 16:21

pistole

Frutter

mysqldump?

tenzij je overlappende id's hebt, dan ontkom je er m.i. niet aan om je data via queries over te zetten...

Ik frut, dus ik epibreer


Acties:
  • 0 Henk 'm!

  • Thomasje
  • Registratie: Augustus 2002
  • Laatst online: 29-05-2024

Thomasje

Semacode

Persoonlijk zou ik een script schrijven die op een juiste volgorde een derde nieuwe database aanmaakt.

Acties:
  • 0 Henk 'm!

  • DutchAddick
  • Registratie: December 2002
  • Laatst online: 05-08 17:59
Het vervelende zijn dus inderdaad die overlappende id's, ander zou ik gewoon een import kunnen doen van de ene dataset in de andere database. Maar wat voor script moet ik dan aan denken?

Acties:
  • 0 Henk 'm!

  • dik_voormekaar
  • Registratie: April 2003
  • Laatst online: 19:18
Als ik exporteer vanuit phpMyAdmin, gebruik ik de optie "Use ignore inserts". Daarbij wordt dan wel het oude record overschreven, als die hetzelfde ID heeft.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
CAFC1905 schreef op dinsdag 11 november 2008 @ 08:54:
Maar wat voor script moet ik dan aan denken?
Aan één dat je zelf schrijft. Je dacht dat er een kant-en-klare oplossing was dan?
Wat je kunt doen is DB C aanmaken, DB A importeren en DB B daarna waarbij je alle ID's + 1000000 doet ofzo (of een andere hoge waarde die geen conflicten oplevert). Zolang je consequent alle ID's verhoogt is er niets aan de hand. Uitgaande van synthetic/surrogate keys overigens; heb je ID's met 'betekenis' dan ben je screwed tenzij je de 'overlap' wil overschrijven.

[ Voor 44% gewijzigd door RobIII op 11-11-2008 09:02 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • DutchAddick
  • Registratie: December 2002
  • Laatst online: 05-08 17:59
RobIII schreef op dinsdag 11 november 2008 @ 08:59:
[...]

Aan één dat je zelf schrijft. Je dacht dat er een kant-en-klare oplossing was dan?
Wat je kunt doen is DB C aanmaken, DB A importeren en DB B daarna waarbij je alle ID's + 1000000 doet ofzo (of een andere hoge waarde die geen conflicten oplevert). Zolang je consequent alle ID's verhoogt is er niets aan de hand. Uitgaande van synthetic/surrogate keys overigens; heb je ID's met 'betekenis' dan ben je screwed tenzij je de 'overlap' wil overschrijven.
Ik bedoelde meer of het dan bv een PHP script moet zijn, ik vraag niet om een kant en klare oplossing.
Overigens zijn het allemaal "domme" ID's aleen bedoeld om tabellen te koppelen.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
CAFC1905 schreef op dinsdag 11 november 2008 @ 09:14:
[...]


Ik bedoelde meer of het dan bv een PHP script moet zijn, ik vraag niet om een kant en klare oplossing.
Overigens zijn het allemaal "domme" ID's aleen bedoeld om tabellen te koppelen.
Nah, dan is het toch geen rocket science? Again, maak een nieuwe DB C, loop met PHP (of eender welke andere taal, boeie) door je DB A en insert alle records in C (met ID offset 0). Vervolgens hetzelfde met DB B met daarbij een ID-offset van X naar DB C inserten en done is CAFC1905.

[ Voor 4% gewijzigd door RobIII op 11-11-2008 09:16 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • StephanVierkant
  • Registratie: Mei 2003
  • Laatst online: 08-09 16:22
Even iets uit m'n hoofd:
PHP:
1
2
3
4
5
6
7
<?php 
while(mysql_fetch_array($query))
{
mysql_query("INSERT INTO .....");

mysql_query("UPDATE andere_tabel SET andere_index = '" . mysql_insert_id . "");
}

Zo kan het toch ook?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je zult wel rekening moeten houden met FK's ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • ZaZ
  • Registratie: Oktober 2002
  • Laatst online: 00:06

ZaZ

Tweakers abonnee

Als je ID velden autoincrement velden zijn kan je zoiets oplossing doen om te voorkomen dat je door al je records moet rennen
SQL:
1
2
3
4
5
6
7
8
9
CREATE TABLE NIEUW AS (SELECT * FROM SCHEME1.OUD WHERE ROWNUM = 1);
DELETE FROM NIEUW;
INSERT INTO NIEUW
            (ALLE,VELDEN,BEHALVE,ID)
   (SELECT ALLE,VELDEN,BEHALVE,ID
      FROM SCHEME1.OUD
    UNION
    SELECT ALLE,VELDEN,BEHALVE,ID
      FROM SCHEME2.OUD);

Lekker op de bank


Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
Precies zoals Robll zegt lijkt mij het handigst...

importeer DB A in je nieuwe DB C....
kopieer DB B even naar een DB CopyB en ga in deze tabel alle ID's met een standaardgetal ophogen... dus voor iedere PK en FK in alle tabellen even een update doen op het ID... daarna DB CopyB toevoegen aan DB C...

Acties:
  • 0 Henk 'm!

  • Joshuatree
  • Registratie: November 2002
  • Laatst online: 26-09 21:43
Domme Id's aleen om tabellen te koppelen....
Als ze echt koppelen dan zijn ze dus niet dom als ik het goed begrijp.

Dan zul je eerst moeten kijken hoe de relaties liggen etc...
In MSSQL kun je namelijk niet zomaar ID's aanvullen of weg gooien als deze onderdeel zijn van een relatie...

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Joshuatree schreef op dinsdag 11 november 2008 @ 10:12:
Domme Id's aleen om tabellen te koppelen....
Als ze echt koppelen dan zijn ze dus niet dom als ik het goed begrijp.
Want? Als het gewoon surrogate/synthetic keys zijn zie ik geen probleem?
Joshuatree schreef op dinsdag 11 november 2008 @ 10:12:
Dan zul je eerst moeten kijken hoe de relaties liggen etc...
Uiteraard
Joshuatree schreef op dinsdag 11 november 2008 @ 10:12:
In MSSQL kun je namelijk niet zomaar ID's aanvullen of weg gooien als deze onderdeel zijn van een relatie...
Wie heeft het over MSSQL? En daarbij: je kunt prima de constraints (tijdelijk) uitschakelen of niet eens opnemen in een tijdelijke DB voor import/export doeleinden e.d. om zo de ID's te wijzigen. Als dat consequent gebeurt is er geen probleem.

[ Voor 3% gewijzigd door RobIII op 11-11-2008 10:27 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • DutchAddick
  • Registratie: December 2002
  • Laatst online: 05-08 17:59
Thanks voor de reakties, hier kan ik wel wat mee :)

Acties:
  • 0 Henk 'm!

  • LuCarD
  • Registratie: Januari 2000
  • Niet online

LuCarD

Certified BUFH

RobIII schreef op dinsdag 11 november 2008 @ 08:59:
[...]

Aan één dat je zelf schrijft. Je dacht dat er een kant-en-klare oplossing was dan?
Wat je kunt doen is DB C aanmaken, DB A importeren en DB B daarna waarbij je alle ID's + 1000000 doet ofzo (of een andere hoge waarde die geen conflicten oplevert). Zolang je consequent alle ID's verhoogt is er niets aan de hand. Uitgaande van synthetic/surrogate keys overigens; heb je ID's met 'betekenis' dan ben je screwed tenzij je de 'overlap' wil overschrijven.
Volgens mij kan je beter gaan lopen joinen ;)

code:
1
2
insert into new_table (id, veld1, veld2) 
select NULL as Autokey, b.veld1, b.veld2 from database1.tabel as a inner join database2.tabel b on a.id=b.id


Om het FK probleem te verhelpen zou ik twee extra velden aanmaken in het doel database.
1 veld om de oude id op te slaan en 1 veld met een bron.

Daarna alle tabellen afgaan waar de FK gebruikt word en die dan updaten. En als laatste de extra velden weer netjes verwijderen.

Programmer - an organism that turns coffee into software.


Acties:
  • 0 Henk 'm!

  • winkbrace
  • Registratie: Augustus 2008
  • Laatst online: 24-08 15:17
wat dacht je ervan gewoon alle id's in database 2 te updaten?

code:
1
2
UPDATE table
SET    id = id + 1000000


dan exporteren in sql (in phpMyAdmin) en de gegenereerde sql draaien in database 1 of een nieuwe

edit: dit was dus al eerder gezegd |:(

[ Voor 11% gewijzigd door winkbrace op 11-11-2008 17:35 ]

Pagina: 1