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

Insert ignore into

Estas en el tema de Insert ignore into en el foro de Mysql en Foros del Web. Buenas, Primero de toda gracias a los que lean este tema, a los que me intentan ayudar y a los que ya me han ayudado. ...
  #1 (permalink)  
Antiguo 25/06/2009, 09:25
 
Fecha de Ingreso: julio-2008
Ubicación: Alcañiz-Teruel-España
Mensajes: 182
Antigüedad: 15 años, 9 meses
Puntos: 5
Insert ignore into

Buenas,

Primero de toda gracias a los que lean este tema, a los que me intentan ayudar y a los que ya me han ayudado.

Trabajo con MySQL y PHP y quisiera detectar cuando una Consulta del tipo
"INSERT IGNORE INTO" no ha insertado el registro en la tabla.

Igual el tema es más de PHP y mysql_query(). Pero no se. Si eso me muevan el tema.

Saludos
__________________
Si quieres puedes y si puedes debes. Imposible is nothing!!!
  #2 (permalink)  
Antiguo 25/06/2009, 09:30
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Insert ignore into

La instrucción insert ignore into es usada en muchas ocasiones para evitar la caída de algún script en su ejecución.

Desde php, no sería tanto por el lado del insert ignore, sino realizar una consulta sobre la tabla y preguntar si el id a insertar ya existe. Si es así insertarla en una tabla temporal y seguir ejecutando el script.
De esta forma, cuando se terminen de ejecutar los inserts, revisar en la tabla temporal, cuales fueron los registros que ya estaban y no se sobreescribieron. Pero como te digo, para esto no sería necesario utilizar el insert ignore into.

Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 25/06/2009, 09:42
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Insert ignore into

INSERT IGNORE se usa muy habitualmente cuando es el usuario o la aplicación quien pone el valor de la PK, sea esta numérica y autoincremental o no.
El problema pasa porque cuando se hace una inserción de un registro que se supone nuevo, si la PK que está entrando ya existe, entonces MySQL simplemente "ignora" esa inserción y sigue la operación sin que se desencadene ningún error en la base de datos. De no poner la cláusula IGNORE, te daría un error de "duplicate key" y si no has controlado ese estado puede hacerte colapsar el script, como te dice huesos52.
Ahora bien, si lo que quieres es que si existe la clave, en lugar de ignorarlo, realice una actualización, existen dos formas:
1. Usando en ON DUPLICATE KEY UPDATE..., donde defines qué campos se actualizarán y cómo.
2. Usando REPLACE en lugar de INSERT. Esta forma tiene el inconveniente de reemplazar todo el registro por la nueva versión, por lo cual hay que enviarle todos los valores finales de los campos implicados, o de lo contrario suplantará los valores por los nuevos. Esto quiere decir que no hace un agregado o suma de un valor X a un campo Y sino que lo reemplaza, perdiéndose el valor que estaba en Y anteriormente. Por eso hay que manejarse con cuidado.
¿se entiende la idea?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 25/06/2009, 10:26
 
Fecha de Ingreso: julio-2008
Ubicación: Alcañiz-Teruel-España
Mensajes: 182
Antigüedad: 15 años, 9 meses
Puntos: 5
Respuesta: Insert ignore into

Buenas,

Primero gracias por contestar tan rápido.

Os pongo un poco en contexto.
El programa realiza una importacion de una datos de una BD a otra. A medida que se va haciendo la importacion voy registrando las acciones para una vez a finalizando genero un txt de informe tipo.

Cita:
XX/XX/XXXX

Informe de importación
***********************
X registros procesados

X registros añadidos
X registro existentes
X registros defectuosos

A tardado X minutos X segundos
Para contabilizar los registros que ya existian pense en detectar cuando INSERT IGNORE INTO.

En php hago esta query

Código php:
Ver original
  1. $sql="INSERT IGNORE INTO mytabla (campo1,campo2) VALUE ('$value1','$value2')";
  2.  
  3. $consulta = mysql_query ($sql, $conexion)
  4.    or die (fwrite($logimporta,"ERROR SQL:\nQUERY: $instruccion\nERROR: ".mysql_error ($conexion)));

Sustituyendo eso por algo asi...


Código php:
Ver original
  1. $sql="INSERT INTO mytabla (campo1,campo2) VALUE ('$value1','$value2')";
  2.  
  3. $consulta = mysql_query ($sql, $conexion);
  4. if (!$consulta){
  5.    if (/*Duplicate key*/) {
  6.       $nRegExistentes++;
  7.    }else{
  8.       die (fwrite($logimporta,"ERROR SQL:\nQUERY: $instruccion\nERROR: ".mysql_error ($conexion)));
  9.    }
  10. }

¿Como sería para controlar el tipo de error que te arroga MySQL?

Saludos
__________________
Si quieres puedes y si puedes debes. Imposible is nothing!!!
  #5 (permalink)  
Antiguo 25/06/2009, 10:36
 
Fecha de Ingreso: julio-2008
Ubicación: Alcañiz-Teruel-España
Mensajes: 182
Antigüedad: 15 años, 9 meses
Puntos: 5
Respuesta: Insert ignore into

¿Pudiera ser asi?

Código php:
Ver original
  1. $sql="INSERT INTO mytabla (campo1,campo2) VALUE ('$value1','$value2')";
  2.  
  3. $consulta = mysql_query ($sql, $conexion);
  4. if (!$consulta){
  5.    if (mysql_errno($conexion)==1062) {
  6.       $nRegExistentes++;
  7.    }else{
  8.       die (fwrite($logimporta,"ERROR SQL:\nQUERY: $instruccion\nERROR: ".mysql_error ($conexion)));
  9.    }
  10. }


encontre esto en la web oficialde MySQL

Cita:

Error: 1022 SQLSTATE: 23000 (ER_DUP_KEY)

Message: Can't write; duplicate key in table '%s'

....

Error: 1062 SQLSTATE: 23000 (ER_DUP_ENTRY)

Message: Duplicate entry '%s' for key %d
¿Que diferencia hay?

Tabla de errores MySQL

Saludos
__________________
Si quieres puedes y si puedes debes. Imposible is nothing!!!

Última edición por matak; 25/06/2009 a las 10:45
  #6 (permalink)  
Antiguo 25/06/2009, 11:26
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Insert ignore into

Para eso usa simplemente el INSERT INTO y luego controla la salida de error por medio del PHP:
Error de MySQL:
http://ar.php.net/manual/es/function.mysql-error.php
Numero de error en MySQL:
http://ar.php.net/manual/es/function.mysql-errno.php

Valores de error y mensaje devueltos por MySQL:
http://dev.mysql.com/doc/refman/5.0/...-handling.html
__________________
¿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 26/06/2009, 03:59
 
Fecha de Ingreso: julio-2008
Ubicación: Alcañiz-Teruel-España
Mensajes: 182
Antigüedad: 15 años, 9 meses
Puntos: 5
Respuesta: Insert ignore into

Buenas,

Seguramente andabamos contestando a la vez y pusimos prácticamente la misma solución.

Aunque me quedaron unas dudas sobre los códigos de error

Cita:

Error: 1022 SQLSTATE: 23000 (ER_DUP_KEY)

Message: Can't write; duplicate key in table '%s'

....

Error: 1062 SQLSTATE: 23000 (ER_DUP_ENTRY)

Message: Duplicate entry '%s' for key %d
¿Que diferencia hay?

Saludos y gracias por tu atención
__________________
Si quieres puedes y si puedes debes. Imposible is nothing!!!
  #8 (permalink)  
Antiguo 26/06/2009, 05:15
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Insert ignore into

Uno se genera en el INSERT, el otro en el UPDATE.
En un caso existe una clave en ese registro ya en disco y estás intentando sobreescribirla con un valor de la clave de otro registro.
En el otro caso estás intentando insertar un registro cuya clave ya existe, por lo que no puede escribirlo.

Las diferencias entre errores similares dependen del evento que las dispare.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
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 19:25.