mysql :: insertar en tabla, datos de otra tabla?

187

Me preguntaba si hay una manera de hacer esto únicamente en sql:

q1 = SELECT campaign_id, from_number, received_msg, date_received 
     FROM `received_txts` WHERE `campaign_id` = '8';
INSERT INTO action_2_members (campaign_id, mobile, vote, vote_date)    
    VALUES(q1.campaign_id, q1.from_number, q1.received_msg, q1.date_received);

Nota: q1 devolvería unas 30k filas.

¿Hay alguna manera de hacer lo que estoy intentando arriba en sql recto? ¿Para extraer los datos directamente de una tabla (básicamente una tabla de datos sin procesar) e insertar en otra tabla (básicamente una tabla de datos procesados)?

Granizo
fuente

Respuestas:

401
INSERT INTO action_2_members (campaign_id, mobile, vote, vote_date)  
SELECT campaign_id, from_number, received_msg, date_received
  FROM `received_txts`
 WHERE `campaign_id` = '8'
zerkms
fuente
1
@InSane: 1) dar una respuesta 2) corregir el formato de la pregunta. No te pierdas el pedido la próxima vez ;-)
zerkms
ja ja :-) sí ... nunca he logrado ordenar mis prioridades! :-D
Jagmag
1
¡Trabajando! +1 ¡Perfecto y muy rápido! Gracias amigo. Solo tenía que quitar los corchetes de los campos SELECT ...
Alguien
@zerkms; ¿Los disparadores funcionarán con esta INSERT INTO ... SELECTdeclaración?
piratea
2
@haccks Creo lo mismo que si fuera simplemente "normal"INSERT
zerkms
30

para toda la fila

inserte en xyz seleccione * de xyz2 donde id = "1";

para la columna seleccionada

inserte en xyz (t_id, v_id, f_name) seleccione t_id, v_id, f_name de xyz2 donde id = "1";
Lokesh Deshmukh
fuente
1
El enfoque de toda la fila falla si ya hay un registro existente con una clave primaria coincidente.
HotN
¿Encontraste alguna solución? <El enfoque de toda la fila falla si ya hay un registro existente con una clave primaria coincidente.>
Shivdhwaj Pandey
10

Respondido por zerkms es el método correcto. Pero, si alguien busca insertar más columnas adicionales en la tabla, puede obtenerlo de lo siguiente:

INSERT INTO action_2_members (`campaign_id`, `mobile`, `email`, `vote`, `vote_date`, `current_time`)
SELECT `campaign_id`, `from_number`, '[email protected]', `received_msg`, `date_received`, 1502309889 FROM `received_txts` WHERE `campaign_id` = '8'

En la consulta anterior, hay 2 columnas adicionales llamadas email & current_time .

IamMHussain
fuente
2
¿Qué sucede si quisiera insertar tres filas de datos con los mismos valores de la selección pero valores diferentes para las columnas 'adicionales' agregadas, como correo electrónico y hora actual?
xxstevenxo
4
INSERT INTO Table1 SELECT * FROM Table2
Mher Arsh
fuente
Esta es una respuesta de muy baja calidad. Además, a diferencia de la respuesta aceptada, ni siquiera trata de relacionarse con la información incluida en la pregunta.
Mike
0
INSERT INTO preliminary_image (style_id,pre_image_status,file_extension,reviewer_id,
uploader_id,is_deleted,last_updated) 

SELECT '4827499',pre_image_status,file_extension,reviewer_id,
uploader_id,'0',last_updated FROM preliminary_image WHERE style_id=4827488

Análisis

Podemos usar la consulta anterior si queremos copiar datos de una tabla a otra en mysql

  1. Aquí las tablas de origen y destino son las mismas, también podemos usar tablas diferentes.
  2. Pocas columnas que no estamos copiando como style_id y is_deleted, por lo que las seleccionamos codificadas de otra tabla
  3. La tabla que utilizamos en la fuente también contiene un campo de incremento automático, así que dejamos esa columna y se inserta automáticamente con la ejecución de la consulta.

Resultados de ejecución

1 consultas ejecutadas, 1 éxito, 0 errores, 0 advertencias

Consulta: insertar en preliminar_image (style_id, pre_image_status, file_extension, reviewer_id, uploader_id, is_deleted, last_updated) select ...

5 filas afectadas

Tiempo de ejecución: 0.385 segundos Tiempo de transferencia: 0 segundos Tiempo total: 0.386 segundos

Amit Jain
fuente