Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

2 Tabellen mergen und neue Keys vergeben

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von fjolle, 28 Oktober 2014.

  1. fjolle

    fjolle Neuer Benutzer

    Hallo zusammen,

    ich sitze nun schon seit 2 Tagen an folgendem Problem:

    Ich habe 2 Datenbanken mit jeweils 4 Tabellen (Paper, Affiliation, Email, Degree). Sie haben die gleichen Strukturen, jedoch unterschiedliche Daten, leider wurde beim Erstellen nicht darauf geachtet unterschiedliche Keys zu verwenden, wodurch ich beim mergen das Problem habe, dass die Eintraege zwar alle in der neuen Tabelle landen, allerdings vermischt werden, da die Keys ja nicht mehr eindeutig sind. Die Haupttabelle (Bio) konnte ich merkwuerdigerweise ohne Probleme mergen und ohne Probleme bei der Vergabe von eindeutigen IDs.

    Die Tabelle Paper hat z.B. folgende Spalten:

    Seq, P_ID ,Title, year, CoAuthor, PMID, Flag, Error_Seq

    Die P_ID sollte eindeutig sein, da sie ueber alle Tabellen in der DB hinweg der Schluessel ist, der die Beziehungen herstellt. D.h. diese ID sollte auch wieder richtig auf das Bio-Table verweisen.

    Ich habe folgendes Query aus einem aehnlichen Problemfall genommen und fuer meine Zwecke umgeschrieben, allerdings ist dort immernoch das Problem, dass mir alles vermischt wird.

    CREATE TABLE pmdb_paper LIKE pubmed_db.paper_pubmed
    ALTER TABLE pmdb_paper DISABLE KEYS
    INSERT INTO pmdb_paper SELECT * FROM pubmed_db.paper_pubmed
    INSERT INTO pmdb_paper SELECT * FROM pubmed_db2.paper_pubmed2;
    ALTER TABLE pmdb_paper ENABLE KEYS

    Ich habe versucht ueber den Befehl ON DUPLICATE KEY UPDATE etwas zu bewirken, aber ich fuerchte ich hab ihn nicht richtig verwendet, da ich immer eine Fehlermeldung bekommen habe.

    Mein Problem also:
    Autor A mit der P_ID 100 in der 1. DB sollte am Ende nicht mit Autor B mit der P_ID 100 aus der 2. DB gemixt werden, sondern einer von beiden sollte eine neue ID bekommen..


    Ich habe schon so ziemlich alles ausprobiert was ich an Vorschlaegen oder Tutorials im Netz finden konnte und frage nun daher euch um Hilfe, da ich auch erst seit ein paar Tagen ueberhaupt mit SQL und Datenbanken arbeite und sicher bin, dass mir hier einfach nur iwo der Durchblick zu etwas fehlt.
    Geht das was ich machen moechte denn ueberhaupt?

    Danke schonmal im Voraus fuer eure Vorschlaege und Muehe!
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Du hast also in Kurz diese Tabellen:

    Code:
    test=# create table quelle1 (id int primary key, val text);
    CREATE TABLE   
    Time: 322,591 ms   
    test=*# create table quelle2 (id int primary key, val text);
    CREATE TABLE   
    Time: 3,517 ms   
    test=*# insert into quelle1 values (1, 'id1 aus aus quelle1');
    INSERT 0 1   
    Time: 0,473 ms   
    test=*# insert into quelle1 values (2, 'id2 aus aus quelle1');
    INSERT 0 1   
    Time: 0,203 ms   
    test=*# insert into quelle2 values (1, 'id1 aus aus quelle2');
    INSERT 0 1   
    Time: 0,447 ms
    test=*# insert into quelle2 values (2, 'id2 aus aus quelle2');
    INSERT 0 1
    Time: 0,192 ms
    test=*# select * from quelle1;
     id |  val
    ----+---------------------
      1 | id1 aus aus quelle1
      2 | id2 aus aus quelle1
    (2 rows)
    
    Time: 0,303 ms
    test=*# select * from quelle2;
     id |  val
    ----+---------------------
      1 | id1 aus aus quelle2
      2 | id2 aus aus quelle2
    (2 rows)
    
    und willst das alles in einer haben. Vermutlich ist die ID auch noch jeweils ein Foreign Key in einer anderen Tabelle, oder?

    Also Lösungsweg:

    Code:
    test=*# create table ziel (id serial primary key, id_alt int, quelle text, val text);
    CREATE TABLE
    Time: 62,910 ms
    test=*# insert into ziel (id_alt, quelle, val) select id, 'quelle1',val from quelle1;
    INSERT 0 2
    Time: 0,508 ms
    test=*# insert into ziel (id_alt, quelle, val) select id, 'quelle2',val from quelle2;
    INSERT 0 2
    Time: 0,365 ms
    test=*# select * from ziel;
     id | id_alt | quelle  |  val
    ----+--------+---------+---------------------
      1 |  1 | quelle1 | id1 aus aus quelle1
      2 |  2 | quelle1 | id2 aus aus quelle1
      3 |  1 | quelle2 | id1 aus aus quelle2
      4 |  2 | quelle2 | id2 aus aus quelle2
    (4 rows)
    
    Nun hast Du die Chance, die Foreign Keys anzupassen, dazu die Referenz der Tabellen auf quelle[1,2] auflösen, ein Update machen (unter Verwendung von id und id_alt sowie der Spalte quelle). Dann die Foreign Keys neu auf die jetzige ID-Spalte setzen. Nun kannst Du via ALTER TABLE id_alt und quelle löschen. Voila.
     
  3. fjolle

    fjolle Neuer Benutzer

    Vielen Dank fuer die schnelle Antwort!

    Ich muss leider gestehen, ich verstehe nicht genau, was ich nun machen sollte, auch wenn verstehe, dass du genau das gemacht hast, was ich suche. Koenntest du es etwas genauer erklaeren, bitte?
    Ich habe in beiden Datenbanken uebrigens ca 250 Eintraege, weswegen ich das ganze natuerlich gern moeglichst automatisiert durchfuehren moechte..
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Noch genauer?

    Also, ich hab eine Zieltabelle erstellt, die zusätzliche Spalten hat: id_alt und quelle. In diese via Insert die Daten der Quelltabellen genommen, in die neue id-Spalte den Wert generieren lassen, in id_alt die alte ID und in Quelle den Namen der Ursprungstabelle. Damit hast Du dann noch immer die nötigen Informationen, um

    • bestehende Foreign Keys zu modifizieren
    • zu sehen, was woher kam

    Die Anzahl der Einträge ist irrelevant, oder redest Du von 250 Tabellen, die Du so behandeln willst? Dann würde ich das natülich auch scripten, nur verwende ich eine andere DB als Du, eine Lösung von mir würde Dir also nicht viel helfen - zu primitiv ist Dein MySQL da.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden