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.

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top