Tema: fgetcsv
Ver Mensaje Individual
  #12 (permalink)  
Antiguo 25/09/2013, 06:06
Avatar de gnzsoloyo
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, 3 meses
Puntos: 2658
Respuesta: fgetcsv

Cita:
Iniciado por jolucoes Ver Mensaje
Se me ocurre que le quites la PRIMARY_KEY al id para que permita duplicados.
En teoría debería dejarte entonces el INSERT. Luego ya compruebas si está o no duplicado, o dónde tira el error.
Un saludo.
Eso no tiene absolutamente ningún sentido. No puedes eliminar una clave primaria. Plantear eso implica que no se entiende el sentido de una PK, ni su criterio de definición, y además no es el fondo del asunto (y menos una solución).
El problema es que está tratando de insertar en una tabla de una base de datos, un conjunto de datos de una fuente externa, sin tomarse la mínima molestia de validar previamente que los datos que están ingresando para asegurarse que son consistentes y que cumplen las restricciones de datos de la base.
Eso es un error total.

Este problema es usual cuando se intenta consolidar datos entre diferentes bases, o bien diferentes fuentes de datos. no es extraño en esa situación que dos conjuntos de datos tengan valores de clave similares (solapamiento de claves), simplemente porque pertenecen a diferentes bases de origen, donde las PK son locales. Entonces tendrás N veces la PK 1, la 39 o la 1065. pero eso no es un error, el error es insertar ese dato sin verificar que no se esté produciendo el solapamiento.
¿Cual es la solución?
Bueno, no puedes simplemente descartar la PK entrante y poner lo restante de cada registro, porque no puedes asegurar que el resto de los datos no se esté duplicado. Li hicieras eso, podrías procesar el mismo archivo dos veces y te metería dos veces los mismos datos con diferentes PK.
La solución es hacer una preverificación de los datos que represente una clave primaria natural, como por ejemplo, el numero de documento. Si ya existe, no se manda a insertar, si no existe, se inserta.
Si bien eso implicará doble trabajo, al menos será algo seguro.
Finalmente, si los datos entrantes son correctos, y la PK es el documento, y deseas que se inserten sólo aquellos que no existen en base sin necesidad de verificarlos, simplemente usa INSERT IGNORE INTO...
La cláusula IGNORE hará que no se dispare un error si la clave está duplicada, pero tampoco insertará ese registro cuya clave se duplica.
Obviamente, para usar esa cláusula debes estar seguro de que la PK que estás insertando en el campo ID corresponde a la misma persona tanto en el archivo como en la tabla... Si al menos uno no coincide, deberás hacer el otro proceso.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)