Pregunta

Digamos por ejemplo:

  • Tengo dos mesas: datos_antiguos y nuevos datos.

  • Ambos datos_antiguos y nuevos datos tener una columna llamada esto_es_col.

  • Ambos datos_antiguos y nuevos datos tener varios (cientos) de filas de fechas (2010-02-06, 2010-01-09, 2007-06-02, etc.).Ambas tablas no necesariamente tienen las mismas fechas, pero ambas tienen el mismo formato.

  • Los campos de ambas tablas son varios números enteros.


Mi tarea:

  • Copie los campos de datos_antiguos a nuevos datos.

  • Si existe una fecha en ambas tablas, el campo en nuevos datos será reemplazado.

  • Si la fecha no existe en nuevos datos, luego se agregará la fila correcta y se copiará el campo.


Esto es lo lejos que he llegado:

Crea una columna temporal:

ALTER TABLE `new_data` ADD `tempColumn` TEXT NULL;

Copiar datos de datos_antiguos:

INSERT INTO `new_data` (`tempColumn`) SELECT `this_is_col` FROM `old_data`;

Combinar columna temporal y nuevos datos . esto_es_col.(Realmente no he descubierto este paso ya que no he llegado tan lejos).

MERGE? `tempColumn` `this_is_col`;

Eliminar tabla temporal

ALTER TABLE `new_data` DROP `tempColumn`;

Al realizar la segunda acción (transferir los datos a la columna temporal), aparece este error:

#1062 - Duplicate entry '0000-00-00' for key 1

Y ahora estoy estancado.Cualquier ayuda sería apreciada.Estoy usando MySQL y phpMyAdmin para probar los comandos SQL.

¿Fue útil?

Solución

Suponiendo que sus fechas se indexan como teclas únicas:

INSERT INTO newtable
SELECT *
FROM oldtable
ON DUPLICATE KEY column1=oldcolumn1, ...

Otros consejos

Usted desea insertar ... en la tecla duplicadaActualización .Su solución ya satisface los pasos 1 y 3 de su tarea, en la actualización de la clave duplicada se encargará del paso 2.

Si prefieres eliminar la fila primero, en lugar de actualizar: REEMPLAZAR

También sería solo una línea, entonces:REEMPLAZAR datos SELECCIONAR, no tendría que hacer la rareza de agregar una columna de texto.

¿Qué tal simplemente hacer un UPDATE y INSERT?

UPDATE new_data SET col=col 
FROM new_data a join old_data b on a.this_is_col = b.this_is_col

Entonces

INSERT INTO new_data (cols) SELECT cols 
FROM old_data WHERE this_is_col NOT IN (SELECT this_is_col FROM new_data)

A menos que haya entendido mal...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top