2009-10-01 9 views
7
mesa

Pseudo:¿Es posible usar un comando de tipo LOAD DATA INFILE para ACTUALIZAR filas en el db?

| primary_key | first_name | last_name | date_of_birth | 
| 1   | John Smith |   | 07/04/1982 | 

En el nombre apellido momento contiene un nombre completo para los usuarios muchas filas. El resultado deseado es dividir los datos, por lo que first_name contiene "John" y last_name contiene "Smith".

Tengo un archivo CSV que contiene el formato de datos deseado:

| primary_key | first_name | last_name | 
| 1   | John  | Smith  | 

¿Hay una manera de utilizar el comando LOAD DATA INFILE para procesar el archivo CSV para actualizar todas las filas de esta tabla con el primary_key - y no reemplazar ningún otro dato en la fila durante el proceso (es decir, date_of_birth)?

Respuesta

5

No. Mientras que LOAD DATA INFILE tiene una opción REEMPLAZAR, en realidad reemplazará la fila en cuestión, es decir, eliminará la existente e insertará una nueva.

Si configura su LOAD DATA INFILE para insertar solo ciertas columnas, todas las demás se establecerán en sus valores predeterminados , no en los valores que actualmente contienen.

¿Se puede modificar el archivo CSV para que contenga varias instrucciones UPDATE? Debe ser razonablemente sencillo a través de algunas regex reemplaces.

7

En esta situación usualmente LOAD DATA INFILE a una tabla temporal con una estructura idéntica. Luego hago INSERT con ON DUPLICATE KEY UPDATE de la tabla temporal a la tabla real. Esto permite la verificación del tipo de datos sin arruinar su tabla real; es relativamente rápido y no requiere tocar su archivo .csv.

+0

Creo que también esta es la solución más eficiente ya que el REEMPLAZO puede ser lento. Y su solución puede administrar las inserciones (nuevos registros) y actualizar (registros existentes) a la vez. –

Cuestiones relacionadas