Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

LOAD DATA INFILE me deja campos en blanco

Estas en el tema de LOAD DATA INFILE me deja campos en blanco en el foro de Mysql en Foros del Web. Estoy ejecutando un LOAD DATA LOCAL INFILE. La tabla posee 4 campos de los cuales, solo deseo actualizar 3. En este caso, los campos que ...
  #1 (permalink)  
Antiguo 28/09/2011, 16:15
Avatar de cmarti  
Fecha de Ingreso: noviembre-2003
Ubicación: Buenos Aires - Argentina
Mensajes: 442
Antigüedad: 21 años
Puntos: 1
LOAD DATA INFILE me deja campos en blanco

Estoy ejecutando un LOAD DATA LOCAL INFILE. La tabla posee 4 campos de los cuales, solo deseo actualizar 3. En este caso, los campos que actualizo provienen de un .csv con 3 columnas. Me pasa que el 4to campo de la tabla (char), me queda en blanco. Cómo puedo evitar esto? Es como que el LOAD DATA "me barre" todo el registro es decir que si el record tiene 4 columnas y yo tomo 3 datos del archivo fuente, me "cepilla" la 4ta columna faltante. Probé con agregar una @ a la columna que no deseo actualice nada pero no hay caso. GS.
__________________
When all else is lost the future still remains.
  #2 (permalink)  
Antiguo 29/09/2011, 04:22
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: LOAD DATA INFILE me deja campos en blanco

Postea una muestra del archivo y la sentencia que usas. De ese modo podremos probar lo que dices y ver por donde anda la cosa.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 29/09/2011, 07:21
Avatar de cmarti  
Fecha de Ingreso: noviembre-2003
Ubicación: Buenos Aires - Argentina
Mensajes: 442
Antigüedad: 21 años
Puntos: 1
Respuesta: LOAD DATA INFILE me deja campos en blanco

La tabla tiene 4 campos:"id", "Nombre", "Apellido", "edad" de los cuales con el LOAD DATA INFILE actualizaré solo el campo Apellido dado que id, Nombre y Edad TIENEN DATOS. El archivo .csv tiene solo 3 columnas con datos donde la primer fila son los títulos. Los nombres de las columnas del archivo .csv son "Id", "Nombre", "Apellido" y la sentencia SQL que ejecuto es la siguiente:
Código PHP:
LOAD DATA LOCAL INFILE 'd:/Osi.csv' REPLACE
INTO TABLE pruebaLoad
FIELDS TERMINATED BY 
';'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(id,NombreApellido); 
Por supuesto utilizo REPLACE

Como resultado se actualizan los Apellidos pero me deja en blanco la columna "edad" de la tabla "pruebaLoad" que tenía datos.

La intención de esta prueba es que me respete los datos que se encuentran en la tabla y sobre los cuales en el proceso de carga, no tienen por qué ser actualizados es decir, solo las columnas que me interesan. Gs
__________________
When all else is lost the future still remains.
  #4 (permalink)  
Antiguo 29/09/2011, 08:19
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: LOAD DATA INFILE me deja campos en blanco

Cita:
Como resultado se actualizan los Apellidos pero me deja en blanco la columna "edad" de la tabla "pruebaLoad" que tenía datos.
Aquí la clave de todo es que lo que estás haciendo no es un INSERT como sugerías al principio, sino un REPLACE. Y REPLACE no funciona como UPDATE, sino que da de baja el registro coincidente y lo reemplaza por los valores nuevos.
Como tu no estás enviando las edades, ese valor en el nuevo registro está e blanco. Eso es todo.
Para poder hacer lo que quieres vas a tener que crear una tabla TEMPORARY donde vuelques el LOAD DATA y luego hacer un UPDATE sobre la base de un JOIN usando los ID.
No vas a poder hacer el proceso usando solamente el LOAD DATA.

Yo ya lo sufrí...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 29/09/2011, 11:36
Avatar de cmarti  
Fecha de Ingreso: noviembre-2003
Ubicación: Buenos Aires - Argentina
Mensajes: 442
Antigüedad: 21 años
Puntos: 1
Respuesta: LOAD DATA INFILE me deja campos en blanco

gnzsoloyo Te agradezco la ayuda pero me planteo la siguiente pregunta: Si un cliente tiene la posibilidad de actualizar un volumen de datos importante, no queda otra que el pcdto que vos me decís??. No existe una posibilidad más dinámica? De todo modos me confunde una cosa de la ayuda de mysql con respecto a la sentencia LOAD DATA que dice : También puede descartar un valor de entrada asignándolo a una variable de usuario y no asignando la variable a una columna de tabla:
LOAD DATA INFILE 'file.txt'
INTO TABLE t1
(column1, @dummy, column2, @dummy, column3);
o sea que el primer @dummy corresponde seguramente a una 2da columna del archivo de entrada y el 2do @dummy a una cuarta. Yo hice eso pero no sé si no funcionó porque no definí la variable. En fin, me llama mucho la atención que no exista nada rápido para este menester. De todos modos muchas gracias.
__________________
When all else is lost the future still remains.
  #6 (permalink)  
Antiguo 29/09/2011, 11:44
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: LOAD DATA INFILE me deja campos en blanco

Cuando dice "descartar" un valor de entrada significa que el dato que entra por medio del LOAD DATA no se almacenará en la tabla, no está hablando de que recupere el valor que ya exista en a tabla para rescatarlo y volverlo a guardar.
Acá lo importante es lo que el manual de referencia expresa sobre el REPLACE en el LOAD DATA:
Cita:
Si especifica REPLACE, los registros de entrada reemplazan registros existentes (en otras palabras, los registros que tienen el mismo valor para una clave primaria o única que un registro existente)
Y sobre el REPLACE:
Cita:
REPLACE funciona exactamente como INSERT, excepto que si un valor de la tabla tiene el mismo valor que un nuevo registro para un índice PRIMARY KEY o UNIQUE , el antiguo registro se borra antes de insertar el nuevo.
Cita:
Los valores para todas las columnas se toman de los valores especificados en el comando REPLACE. Cualquier columna no presente adquiere su valor por defecto, como ocurre con INSERT. No puede referirse a valores del registro actual y usarlos en el nuevo registro.
Ese es el corazón del problema.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 30/09/2011, 07:00
Avatar de cmarti  
Fecha de Ingreso: noviembre-2003
Ubicación: Buenos Aires - Argentina
Mensajes: 442
Antigüedad: 21 años
Puntos: 1
Respuesta: LOAD DATA INFILE me deja campos en blanco

gnzsoloyo muy claras tus ratificaciones. Me gustaría ir cerrando la consulta y perdón por la insistencia. Me queda pdte. lo sgte.: Si un cliente tiene la posibilidad de actualizar un volumen de datos importante, no queda otra que el pcdto que vos me decís??. Gs. de antemano.
__________________
When all else is lost the future still remains.
  #8 (permalink)  
Antiguo 30/09/2011, 07:47
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: LOAD DATA INFILE me deja campos en blanco

Hasta lo que tengo de experiencia en MySQL, ese sería el único camino, si el conjunto de datos se debe cargar por LOAD DATA.
De todos modos ten en cuenta esto: Ese proceso, incluso usando tablas TEMPORARY ex extremadamente rápido, porque se trata de procesos masivos y sólo estamos hablando de dos sentencias... A mi entender te estás ahogando anticipadamente en un vaso de agua.
Yo no creo que esto te resulte ni complejo, ni lento de hacer. Yo hago algo muy parecido con un bloque de datos mucho más complejo, con validaciones muy enredadas, con consultas a varias tablas que contienen millones de registros, y el proceso completo me devuelve el resultado en apenas algunos segundos... en una PC común.

Pruébalo y me dices.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 30/09/2011, 08:45
Avatar de cmarti  
Fecha de Ingreso: noviembre-2003
Ubicación: Buenos Aires - Argentina
Mensajes: 442
Antigüedad: 21 años
Puntos: 1
Respuesta: LOAD DATA INFILE me deja campos en blanco

ok gnzsoloyo. Lo voy a probar. Gs. de nuevo. Abrazo !!!
__________________
When all else is lost the future still remains.

Etiquetas: blanco, campos, data, infile, load, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:25.