Combina due colonne insieme da tabelle separate
-
17-09-2020 - |
Domanda
Diciamo ad esempio:
Ho due tabelle: vecchi_dati E nuovi_dati.
Entrambi vecchi_dati E nuovi_dati avere una colonna chiamata questo_è_col.
Entrambi vecchi_dati E nuovi_dati avere varie (centinaia) di righe di date (2010-02-06, 2010-01-09, 2007-06-02, ecc.).Entrambe le tabelle non hanno necessariamente le stesse date, ma hanno entrambe lo stesso formato.
I campi di entrambe le tabelle sono vari numeri interi.
Il mio compito:
Copia i campi da vecchi_dati A nuovi_dati.
Se esiste una data in entrambe le tabelle, il campo in nuovi_dati sarà rimpiazzato.
Se la data non esiste in nuovi_dati, verrà aggiunta la riga corretta e il campo verrà copiato.
Ecco quanto sono arrivato lontano:
Crea una colonna temporanea:
ALTER TABLE `new_data` ADD `tempColumn` TEXT NULL;
Copia i dati da vecchi_dati:
INSERT INTO `new_data` (`tempColumn`) SELECT `this_is_col` FROM `old_data`;
Combina colonna temporanea e nuovi_dati . questo_è_col.(Non ho davvero capito questo passaggio poiché non sono arrivato così lontano).
MERGE? `tempColumn` `this_is_col`;
Elimina la tabella temporanea
ALTER TABLE `new_data` DROP `tempColumn`;
Dopo aver eseguito la seconda azione (trasferimento dei dati nella colonna temporanea) ottengo questo errore:
#1062 - Duplicate entry '0000-00-00' for key 1
E ora sono bloccato.Qualsiasi aiuto sarebbe apprezzato.Sto utilizzando MySQL e phpMyAdmin per testare i comandi SQL.
Soluzione
Supponendo che le tue date siano indicizzate come chiavi univoche:
INSERT INTO newtable
SELECT *
FROM oldtable
ON DUPLICATE KEY column1=oldcolumn1, ...
Altri suggerimenti
tu vuoi INSERISCI...SU AGGIORNAMENTO CHIAVE DUPLICATA.la tua soluzione soddisfa già i passaggi 1 e 3 del tuo compito, ON DUPLICATE KEY UPDATE si occuperà del passaggio 2.
Se preferisci eliminare prima la riga, anziché aggiornarla: SOSTITUIRE
Sarebbe anche solo una riga, quindi:REPLACE data SELECT, non dovresti fare la stranezza aggiungendo una colonna di testo.
Che ne dici di fare semplicemente un UPDATE
E INSERT
?
UPDATE new_data SET col=col
FROM new_data a join old_data b on a.this_is_col = b.this_is_col
Poi
INSERT INTO new_data (cols) SELECT cols
FROM old_data WHERE this_is_col NOT IN (SELECT this_is_col FROM new_data)
A meno che non abbia capito male...