Combine dos columnas de tablas separadas
-
17-09-2020 - |
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.
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...