Kombinieren Sie zwei Spalten aus separaten Tabellen
-
17-09-2020 - |
Frage
Sagen wir zum Beispiel:
Ich habe zwei Tabellen: alte_Daten Und neue Daten.
Beide alte_Daten Und neue Daten Habe eine Spalte namens this_is_col.
Beide alte_Daten Und neue Daten haben verschiedene (Hunderte) Datumszeilen (06.02.2010, 09.01.2010, 02.06.2007 usw.).Beide Tabellen haben nicht unbedingt die gleichen Daten, aber beide haben das gleiche Format.
Die Felder beider Tabellen sind verschiedene Ganzzahlen.
Meine Aufgabe:
Kopieren Sie die Felder von alte_Daten Zu neue Daten.
Wenn in beiden Tabellen ein Datum vorhanden ist, wird das Feld in neue Daten wird ersetzt werden.
Wenn das Datum nicht existiert neue Daten, dann wird die richtige Zeile hinzugefügt und das Feld kopiert.
So weit bin ich gekommen:
Erstellen Sie eine temporäre Spalte:
ALTER TABLE `new_data` ADD `tempColumn` TEXT NULL;
Daten kopieren von alte_Daten:
INSERT INTO `new_data` (`tempColumn`) SELECT `this_is_col` FROM `old_data`;
Kombinieren Sie temporäre Spalte und neue Daten . this_is_col.(Ich habe diesen Schritt noch nicht wirklich herausgefunden, da ich noch nicht so weit gekommen bin.)
MERGE? `tempColumn` `this_is_col`;
Temporäre Tabelle löschen
ALTER TABLE `new_data` DROP `tempColumn`;
Beim Durchführen der zweiten Aktion (Übertragen der Daten in die temporäre Spalte) erhalte ich diese Fehlermeldung:
#1062 - Duplicate entry '0000-00-00' for key 1
Und jetzt stecke ich fest.Jede Hilfe wäre dankbar.Ich verwende MySQL und phpMyAdmin, um die SQL-Befehle zu testen.
Lösung
Angenommen, Ihre Daten sind als eindeutige Schlüssel indiziert:
INSERT INTO newtable
SELECT *
FROM oldtable
ON DUPLICATE KEY column1=oldcolumn1, ...
Andere Tipps
Sie wollen EINFÜGEN ...AUF DUPLICATE KEY UPDATE.Ihre Lösung erfüllt bereits die Schritte 1 und 3 Ihrer Aufgabe, ON DUPLICATE KEY UPDATE kümmert sich um Schritt 2.
Wenn Sie die Zeile lieber zuerst löschen möchten, anstatt sie zu aktualisieren: ERSETZEN
Es wäre auch nur eine Zeile, also:REPLACE data SELECT, Sie müssten sich nicht mit dem Hinzufügen einer Textspalte befassen.
Wie wäre es, wenn Sie einfach eine machen würden? UPDATE
Und INSERT
?
UPDATE new_data SET col=col
FROM new_data a join old_data b on a.this_is_col = b.this_is_col
Dann
INSERT INTO new_data (cols) SELECT cols
FROM old_data WHERE this_is_col NOT IN (SELECT this_is_col FROM new_data)
Sofern ich es nicht falsch verstanden habe...