2 Tabellen mergen und neue Keys vergeben

fjolle

Neuer Benutzer
Beiträge
2
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!
 
Werbung:
Hallo zusammen,

ich sitze nun schon seit 2 Tagen an folgendem Problem:

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.
 
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..
 
Werbung:
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?

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

Ich habe in beiden Datenbanken uebrigens ca 250 Eintraege, weswegen ich das ganze natuerlich gern moeglichst automatisiert durchfuehren moechte..

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.
 
Zurück
Oben