2017-07-26 5 views
0

Ich habe ein ähnliches Problem, das zuvor gelöst wurde here. Es gibt jedoch einen entscheidenden Unterschied. Ich muss die Beziehungen zu den Originaldaten behalten.Kopieren Sie Daten in eine andere Tabelle plus eine Verknüpfungstabelle, um die Beziehung zu pflegen

Zum Beispiel vorstellen, gibt es eine Tabelle mit Informationen wie diese:

user {id, first, last, address} 

Ich möchte den Adressabschnitt aus der Tabelle ‚Nutzer‘ und in seine eigene ‚Adresse‘ Tabelle bewegen.

user {id, first, last} 
address {id, address} 
user_address {user_id, address_id} 

so die neue ‚Adresse‘ Tabelle würde die Daten enthält, die in der Tabelle ‚Nutzer‘ und die ‚user_address‘ Link-Tabelle gespeichert verwendet werden würde, um die Verbindung zu dem ursprünglichen Benutzer aufrechtzuerhalten.

+0

Ist es wahr, dass "Adresse" -Feld in der "Adresse" Tabelle eindeutig sein wird? –

+0

Das ist keine Voraussetzung. Ich bin in Ordnung mit doppelten Adressen. Aus Gründen der Einfachheit in diesem Projekt ist es wahrscheinlich am besten, nicht einzigartig zu sein. –

+0

Ich habe die Antwort gepostet. Es wird keine Duplikate in der Tabelle "Adresse" geben. –

Antwort

0

Um das gewünschte Ergebnis zu erzielen, sollten Sie drei Migrationsskripts anwenden.

INSERT INTO user(id, first, last) 
SELECT 
    u.id, 
    u.first, 
    u.last 
FROM 
    old_user u 

 

INSERT INTO address(id, address) 
SELECT DISTINCT 
    /* I assume, that "id" is populated automatically (by increment etc.) */ 
    u.address 
FROM 
    old_user u 

 

INSERT INTO user_address(user_id, address_id) 
SELECT 
    u.id, 
    a.id 
FROM 
    old_user u 
JOIN 
    address a ON a.address = u.address 
+0

Also das erste Bit wird verwendet, um eine Kopie zu erstellen und die ursprüngliche Tabelle zu bereinigen? –

+0

Nein, benenne zuerst die Tabelle mit alter Struktur in etwas wie "old_user" um, dann lege 3 neue Tabellen mit entsprechenden Strukturen an und wende dann diese Skripte an. –

+0

ok, und meine letzte Frage: Was wäre, wenn es mehr Attribute als nur Adresse und nicht eindeutig wäre? Könnte ich noch einen Join in mehr als einer Spalte machen und nur die "unterschiedlichen" Bits in der Select-Anweisung entfernen? z.B. adresse = {adresse, adresse1, stadt, state, zip} –

Verwandte Themen