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

Insert select * on duplicate key

Estas en el tema de Insert select * on duplicate key en el foro de Mysql en Foros del Web. Buenas, Tengo un problema a la hora de hacer un INSERT INTO SELECT *, con el DUPLICATE KEY, porque me inserta 0 filas. El código ...
  #1 (permalink)  
Antiguo 25/05/2010, 05:06
 
Fecha de Ingreso: octubre-2008
Mensajes: 177
Antigüedad: 15 años, 6 meses
Puntos: 1
Insert select * on duplicate key

Buenas,

Tengo un problema a la hora de hacer un INSERT INTO SELECT *, con el DUPLICATE KEY, porque me inserta 0 filas.

El código que tengo es:

Código:
INSERT INTO tabla_1 SELECT * FROM tabla_2 WHERE condiciones ON DUPLICATE KEY UPDATE id = VALUES (id)
Tengo muchas tablas que insertan los registros en la tabla 1 en un momento dado, y para evitar que se produzca el error del duplicate key, introduje el ON DUPLICATE KEY UPDATE, pero en este caso, no me hace caso, me dice que filas insertadas son 0, pero sin darme ningún error.

¿Alguna idea al respecto? :S
  #2 (permalink)  
Antiguo 25/05/2010, 06:03
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Insert select * on duplicate key

El update lo quieres hacer sobre el id?

No parece logico....

Lo normal es que si el id ya existe se haga un update sobre los otros campos del registro no sobre el id....

Quim
  #3 (permalink)  
Antiguo 25/05/2010, 06:12
 
Fecha de Ingreso: octubre-2008
Mensajes: 177
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Insert select * on duplicate key

Hola,

No no, lo que quiero es añadir el registro, y si el ID ya existe en otro registro, pues que lo cambie con el auto_increment de la columna.

Esto es porque tengo muchas tablas, decenas, que en un momento dado las junto en la tabla_1, y como todas tienen el auto_increment en ID, pues en algunos casos se repiten, y no me deja entonces hacer el insert en la tabla_1 de los registros cuyo ID ya existen.
  #4 (permalink)  
Antiguo 25/05/2010, 07:12
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, 5 meses
Puntos: 2658
Respuesta: Insert select * on duplicate key

Pues la forma en que lo estás haciendo no solo es incorrecta sino que no tiene sentido...
El tema es así:
Si tienes dos tablas con iguales campos y quieres volcar los datos de una de ella en la otra, sabiendo que sólo puede haber repeticiones en los ID y no en el resto de los datos, lo que debes hacer es invocar los campos que vas a insertar, omitiendo el ID:
Código MySQL:
Ver original
  1. INSERT INTO tabla1(B, C, D, E,  F, G, H, I, J)
  2. SELECT B, C, D, E,  F, G, H, I, J
  3. FROM tabla2;
Es decir que lo que no puedes hacer es invocar todos los campos con "*"....
Lo siento, pero eso es lo que se hace en estos casos.

Recuerda que si tienes un autoincrement, ese dato no se debe enviar en un INSERT, ya que lo maneja el MySQL.
__________________
¿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 25/05/2010, 08:48
 
Fecha de Ingreso: octubre-2008
Mensajes: 177
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Insert select * on duplicate key

Hola,

Mi problema es que cada tabla se compone de más de 30 columnas, y por lo tnto no es óptimo el nombrar cada una de ellas.

He encontrado ya el sistema. Sería algo así, por si a alguien le surge el problema más adelante:

INSERT INTO tabla_1 SELECT * FROM tabla_2 ON DUPLICATE KEY UPDATE id = (SELECT MAX(id) FROM tabla_1)+1

Con esto lo que hace es renombrar el ID de los datos que inserta nuevos en la tabla_1, empezando en el número siguiente del ID máximo encontrado.

Gracias de todas formas!
  #6 (permalink)  
Antiguo 25/05/2010, 10:12
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, 5 meses
Puntos: 2658
Respuesta: Insert select * on duplicate key

Es algo ineficiente, porque envía a realizar una lectura por cada registro ingresado.
Además lo de poner los 30 nombres de campos no es un problema trascendente, ya que la lista de campos ya la tientes en la tabla.
Yo hago lo mismo en una tabla de 137 columnas y escribir la sentencia me llevó menos de 5 minutos... El truco es saber cómo recuperar la lista de campos sin tener que escribirlos
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: duplicate, insert, key, select
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 14:26.