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

Insertar si no existe en la tabla

Estas en el tema de Insertar si no existe en la tabla en el foro de Mysql en Foros del Web. Buenas, Hasta ahora he estado realizando cargas masivas con INSERTS múltiples, pero resulta que esto está bien cuando llamas al script por primera vez y ...
  #1 (permalink)  
Antiguo 16/01/2011, 15:30
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Insertar si no existe en la tabla

Buenas,

Hasta ahora he estado realizando cargas masivas con INSERTS múltiples, pero resulta que esto está bien cuando llamas al script por primera vez y haces la carga masiva. Pero si resulta que tienes que hacer esta llamada en varias ocasiones a lo largo de día, puede ser que la mitad de los datos no hayan cambiado y ya estén en la base de datos.

En ese caso, no deberías insertar nada.
El procedimiento que uso es, creo un bucle que recorre un array con 100.000 registros, entonces para cada valor del array compruebo si existe en la tabla de la base de datos

Código SQL:
Ver original
  1. SELECT COUNT(pronostico_id) FROM pronosticos WHERE pronostico_id=$pronostico_id"

Si no existe guardo ese dato en un array insertMultiples, para luego al final del script hacer el insert múltiple.

Mi pregunta es, ¿veis alguna alguna forma de acelerar el proceso? porque comparar 100.000 valores del array para ver si existe o no, y luego hacer el insert múltiple, no sé si es la mejor opción, o existe un select múltiple?? xD

Es lo que hay? un stored P, ayudaría en rendimiento?

Muchas gracias de antemano!
  #2 (permalink)  
Antiguo 16/01/2011, 18:46
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: Insertar si no existe en la tabla

Yo trataría que la tabla donde se insertan los datos tuviese como PK uno de los datos a insertar o grupo de ellos), y no fuese un autoincremental. De ese modo simplemente podrías usar un INSERT IGNORE...
__________________
¿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 17/01/2011, 07:24
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Insertar si no existe en la tabla

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Yo trataría que la tabla donde se insertan los datos tuviese como PK uno de los datos a insertar o grupo de ellos), y no fuese un autoincremental. De ese modo simplemente podrías usar un INSERT IGNORE...
No acabo de entender tu explicación, te pongo otro ejemplo

Consulta para verificar si existe SELECT

Código SQL:
Ver original
  1. SELECT competicion_id FROM partidos WHERE competicion_id=$competicion_id AND evento_id=$evento_id AND fecha_id=$fecha_id

competicion_id en la tabla partidos es una clave foránea que se relaciona con la tabla competiciones.

Luego en caso que no exista ese registro tengo wl INSERT

Código SQL:
Ver original
  1. INSERT INTO partidos (competicion_id,evento_id,fecha_id) VALUES ($competicion_id,$evento_id,$fecha_id)

En la tabla partidos el único campo que es PK es el partido_id, que es autoincremental y que no inserto explicitamente en la consulta anterior como puedes ver...

Exactamente que propones que sería lo óptimo?

Muchas gracias de antemano
  #4 (permalink)  
Antiguo 17/01/2011, 08:01
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: Insertar si no existe en la tabla

Si los valores de competicion_id y evento_id ya vienen definidos en la feunte de datos, y son la PK de la tabla destino, sólo necesitas esto:
Código MySQL:
Ver original
  1. INSERT IGNORE INTO partidos (competicion_id,evento_id,fecha_id)
  2. VALUES ($competicion_id,$evento_id,$fecha_id)
El ignore hace que si la PK se duplica, entonces ignora la inserción y no devuelve mensaje de error, pasando al siguuiente.
Pero sólo te servirá si y sólo si la PK de la tabla destino está completamente incluida en el conjunto a insertar.

Por otro lado, sino no es así, yo plantearía como solución el uso de una tabla temporal y procesaría la validación directamente en un stored procedure.
__________________
¿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 17/01/2011, 08:40
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Insertar si no existe en la tabla

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Pero sólo te servirá si y sólo si la PK de la tabla destino está completamente incluida en el conjunto a insertar.
En el conjunto a insertar... te refieres aquí VALUES ($competicion_id,$evento_id,$fecha_id) ?

Y debería aparecer dentro de este insert la clave primaria PK de la tabla destino, (donde se hace el insert), este caso la tabla partidos? estamos hablando de que debe aparecer partido_id clave PK autonumérica, como valor en el insert...

Sí es así, el partido_id no se lo paso al insert, más que nada pq al ser autoincremental no tengo forma de saber el valor que toca...

¿Serias tan amable de decirme como harías el SP?

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Por otro lado, sino no es así, yo plantearía como solución el uso de una tabla temporal y procesaría la validación directamente en un stored procedure.
Muchas gracias de antemano
  #6 (permalink)  
Antiguo 17/01/2011, 11:48
Avatar de neodani  
Fecha de Ingreso: marzo-2007
Mensajes: 1.811
Antigüedad: 17 años, 1 mes
Puntos: 20
Respuesta: Insertar si no existe en la tabla

He estado estudiando la posibilidad de convertir alguno de los campos en PK y existiría una, pero le veo un inconveniente, a ver que os parece...

Este campo PK actualmente tendría un valor de 26 millones, y no se repetiría,pero la "desventaja" es esa, que empezaría en el campo 26.000.000 millones, de ahí hacia delante... 26.000.001, 26.000.002. Y no sé hasta que punto es optimo tener una PK con esos valores tan altos.

¿Podéis darme vuestra opinión?

Muchas gracias!

Etiquetas: existe, tablas
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 16:33.