mysqldump con INSERT ... ON DUPLICATE

21

Quiero fusionar datos de una base de datos a otra. Entonces creo un volcado con mysqldumpy luego lo importo a otra base de datos (con la misma estructura de tablas). No tengo ningún problema (como entradas duplicadas u otra cosa) en este caso.

Pero hago algunas fusiones con fines de prueba y haré la fusión final más tarde. Por lo tanto, quiero ejecutar la fusión (los datos pueden modificarse) varias veces. Tenga en cuenta que mis filas en mis tablas nunca se eliminan, solo se pueden insertar o actualizar.

¿Puedo crear mysqldump con la opción ON DUPLICATE? ¿O puedo fusionar el volcado que inserta datos nuevos y actualizar los datos modificados?

Claro, puedo insertar ON DUPLICATEen el volcado manualmente, pero quiero automatizar el proceso de fusión.

Xupypr MV
fuente

Respuestas:

34

Hay opciones para ayudarlo en esto:

  --insert-ignore     Insert rows with INSERT IGNORE.
  --replace           Use REPLACE INTO instead of INSERT INTO.
  -t, --no-create-info
                      Don't write table creation info.

Mantenga este paradigma en mente

  • mysqldump todo desde DB1 en DUMP1
  • cargar DUMP1 en DB3
  • mysqldump todo desde DB2 usando --replace (o --insert-ignore) y --no-create-info en DUMP2
  • cargar DUMP2 en DB3
RolandoMySQLDBA
fuente
1
Espere un minuto: el uso de --replace significa que los datos de DB2 sobrescribirán los datos de DB1, y el uso de - inserción-ignorar significa que prevalecen los datos de DB1. La pregunta parece preguntar cómo hacer ACTUALIZAR en el caso de claves duplicadas. En cualquier caso, me gustaría saberlo.
Edward Newell
@EdwardNewell Tenga en cuenta que --replacees equivalente a hacerlo ON DUPLICATE UPDATEen cada columna. Desafortunadamente, mysqldump no está diseñado para actualizar columnas específicas debido a la naturaleza de carga y descarga masiva de mysqldump. Mi respuesta simplemente revela lo que mysqldump es capaz de hacer. Tendría que escribir un código personalizado, aparte de mysqldump, para hacerlo ON DUPLICATE UPDATE.
RolandoMySQLDBA
Mientras DB1 y 2 tengan exactamente el mismo esquema, tienes razón. Pero supongamos que DB1 tiene campos adicionales. Entonces --replace hará que los campos adicionales vuelvan a los valores predeterminados (o un error si no hay valores predeterminados) en lugar de simplemente actualizar los campos compartidos. Soy consciente de la situación de la OP es de dos bases de datos con los mismos esquemas, sino simplemente señalando que no es una diferencia, y sería útil disponer de un verdadero vertedero de tipo de actualización en ciertos casos (estoy frente a una ahora!)
Edward Newell
1
Tenga en cuenta que si hay claves externas que apuntan al registro que se está actualizando, el uso REPLACE INTOpodría fallar porque el registro no se puede eliminar al cortar esas relaciones. Si es así ON DELETE CASCADE, vaciará las tablas que dependen de la que se esté actualizando. REPLACE INTOEs una operación bastante peligrosa.
Christopher Schultz
1
@RolandoMySQLDBA De acuerdo. Solo quería comentar para que cualquiera que lea esta respuesta entienda que estas opciones (particularmente REPLACE INTO) pueden ser peligrosas y tener efectos "sorprendentes". Buena respuesta: solo quería agregar una advertencia.
Christopher Schultz