SQL Spalte auslagern mit Fremdschlüsseln ersetzten

Cirox

Cadet 3rd Year
Registriert
Jan. 2016
Beiträge
42
Hallo liebe ComputerBase-Community,

gibt es ein SQL Statement oder eine gute Möglichkeit, um Daten aus einer Spalte in eine neue Tabelle zu verschieben und diese dann mit Fremdschlüsseln in der alten Tabelle zu referenzieren?

Natürlich könnte ich das alles von Hand machen und dann beispielweise überall wo 'test' stand jetzt eine 1 als Fremdschlüssel eintragen, aber da es über 600 verschiedene Zeilen sind, suche ich nach einer leichteren Methode.


Mit freundlichen Grüßen

Cirox
 
Hmm:
SQL:
begin transaction;
create table fremd(id NOT NULL INTEGER PRIMARY KEY, data TEXT);
insert into fremd(data)select data from original;
alter table original add (data_id INTEGER NOT NULL);
update original set data_id=fremd.id join fremd on fremd.data=original.data;
alter table original remove (data);
commit;
Die genaue Syntax (vor allem bei alter table und create table) ist natürlich sicherlich ne andere. Aber der Rest müsste passen. Wichtig: In den Transaktionen kannst du kurzzeitig mal FOREIGN KEY Relations verletzten, sofern sie bis zum COMMIT wieder richtiggebogen sind.

Das was du wahrscheinlich suchst (das fehlende Puzzlestück), ist vermutlich der UPDATE … JOIN Teil.
 
Etwas in der Richtung, unter Annahme, dass du die neue Tabelle mit ner Auto-Inkrement ID versehen hast.

SQL:
SELECT DISTINCT Type
INTO Types
FROM Entities;

UPDATE
    Entities E,
    Types T
SET
    E.Type = T.Id
WHERE
    E.Type = T.Name;


Edit:
Die Variante von @Hancock schaut praktischer aus :D

Edit²:
Wichtig wäre eventuell noch zu wissen, welches SQL genau du brauchst. Das UPDATE + JOIN von @Hancock dürfte MSSQL sein, während mein UPDATE in MariabDB geht.
 
Zuletzt bearbeitet:
Bagbag schrieb:
Die Variante von @Hancock schaut praktischer aus :D
Sie sind identisch, bloß andere Syntax. (Join ist wie multi table select mit where, außer man verwendet outer or left/right joins).

Was du beachten musst, unsere Varianten funktionieren nicht, wenn data nicht eindeutig ist (bzw. sie liefern dir nicht das, was du denkst, dass du vermutlich willst). Es werden jetzt identische data-Werte auf die gleiche ID bekommen, da der "erste" Datensatz für alle Zeilen verwendet wird.

Um das zu umgehen, musst du in der zweiten Tabelle den Primary key (oder eine UNIQUE Spalte) mit insert-en und mit dieser Spalte beim UPDATE JOIN-en, dann hast du nur 1-zu-1 Beziehungen zwischen den beiden Spalten. Wenn du das nicht machst, hast du mglw. einzelne 1-zu-n und 0-zu-1 Beziehungen.
 
Hancock schrieb:
Sie sind identisch, bloß andere Syntax.
Ja, ich meinte eher, dass bei meinem Skriptchen weder Tabellen erstellt noch modifiziert werden, man also nach wie vor manches manuell erledigen muss.
 
Vielen Dank für die schnellen Antworten. Habe das über MySQL und mit destinct gemacht. Hat perfekt funkzioniert.
 
Zurück
Oben