2012-04-12 13 views
0

Ich baue auf einer bestehenden Datenbank mit einer Beziehungskonstruktion auf, die ich nirgendwo zuvor gesehen habe.Zwei Tabellen mit einer Beziehung verschmelzen

Ich habe drei Tabellen:

legend1 
legid  INT(11), AUTO_INCREMENT, PRIMARY 
description VARCHAR(255) 

legend2 
legid  INT(11), AUTO_INCREMENT, PRIMARY 
description VARCHAR(255) 

items 
id   INT(11), AUTO_INCREMENT, PRIMARY 
name  VARCHAR(255) 
legid  INT(11) 
legend  VARCHAR(8) 

Jeder Datensatz in items entweder legend1 oder legend2 auf Daten bezieht. Das Feld items.legend bestimmt, welcher davon es ist. Ich möchte diese Konstruktion loswerden, da legend1 und legend2 eine identische Struktur haben. Das einzige, was anders ist, ist der Inhalt.

Ich möchte diese Konstruktion haben:

legend 
legid  INT(11), AUTO_INCREMENT, PRIMARY 
description VARCHAR(255) 

items 
id   INT(11), AUTO_INCREMENT, PRIMARY 
name  VARCHAR(255) 
legid  INT(11) 

Das Problem ist, dass die Tische sind voll und keine Daten verloren gehen können. Die ID beider Tabellen beginnt bei 1, so dass fast jeder Primärschlüssel kollidiert.

Ich habe diese Anfrage:

INSERT INTO legend1 (description) SELECT description FROM legend2; 

Diese Abfrage funktioniert nicht, weil es von legend2 verwiesen ids vermasselt.

+0

Haben Sie alle doppelten Beschreibungen in legend1 müssen eingestellt und legend2? –

+0

Es gibt keine doppelten Beschreibungen im Moment, aber es könnte in der Zukunft geben. – ONOZ

+0

spezifizieren Sie die Beschreibungspalte zur Tabelle wie 'legend1'' description' AS 'legend1_desc' –

Antwort

1

Nachdem Sie Ihre INSERT-Abfrage ausgeführt haben:

INSERT INTO legend1 (description) SELECT description FROM legend2;

Führen Sie die folgende Abfrage

UPDATE items SET legid = (SELECT legid FROM legend1 WHERE legend1.description = items.description) WHERE legend ='something to define that it is from the legend2 table'

Bitte beachte, dass ich die Abfrage nicht versucht haben, aber die Lösung ist so etwas wie Dies. Wenn Sie die Syntaxfehler herauslesen, die ich gemacht habe, bin ich sicher, dass es funktioniert.

Was sie tut, ist die folgende: Nachdem Sie Ihre gesamte legend2 Tabelle in die legend1 Tabelle einfügen Sie Ihren Artikel Tabelle aktualisieren die entsprechenden legendid

+0

Hmm, WO legend1.description = items.legid sollte in den meisten Fällen nichts zurückgeben, da Beschreibung ein VARCHAR und legid ein INT ist. – ONOZ

+0

Aber ich sehe was du da gemacht hast! Es sollte legend1.legid sein und dann funktioniert es. Vielen Dank! – ONOZ

+0

Ihr teilweise richtig! Es ist in der Tat falsch an meinem Ende, aber ich denke, es sollte legend1.description = items.description sein –

Verwandte Themen