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.

War es hilfreich?

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...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top