Insertar registros de un select en MySQL

En este artículo vamos a explicar cómo insertar registros a partir de una consulta select en una base de datos MySQL. En ocasiones, necesitamos insertar datos en una tabla basándonos en los resultados de una consulta SELECT. Esto es un escenario común cuando queremos transferir datos específicos de una tabla a otra o cuando necesitamos realizar alguna manipulación de datos antes de la inserción. Veamos cómo realizar este tipo de inserciones mediante ejemplos de código prácticos.

Sintaxis para insertar registros de un select

La sintaxis completa para insertar registros desde un select en MySQL es la siguiente:

INSERT INTO tabla_destino (nombre_columna1, nombre_columna2, ...)
SELECT valor_columna1, valor_columna2, ...
FROM tabla_origen
WHERE condicion;

Esta consulta insertará registros en la tabla_destino seleccionando datos específicos de la tabla_origen basándose en una condición. El desglose del código es el siguiente:

  • INSERT INTO tabla_destino (nombre_columna1, nombre_columna2, ...) Especifica la tabla de destino y las columnas en las que se insertarán los datos.
  • SELECT valor_columna1, valor_columna2, ... FROM tabla_origen Selecciona los valores de las columnas en la tabla de origen que se insertarán en la tabla de destino.
  • WHERE condicion Especifica la condición que debe cumplirse para que los datos de la tabla de origen se seleccionen e inserten en la tabla de destino. Solo se seleccionarán los registros que cumplen con esta condición.

Este es el código básico para insertar datos específicos desde una tabla origen a una tabla destino, aplicando una condición para seleccionar los registros deseados. Esta es una forma común de realizar operaciones de inserción condicional en MySQL. En este ejemplo, es importante destacar que las columnas en la tabla de destino deben coincidir en número y tipo de dato con las columnas seleccionadas en la tabla de origen.

También podemos realizar la inserción omitiendo las columnas:

INSERT INTO tabla_destino 
SELECT valor_columna1, valor_columna2, ...
FROM tabla_origen
WHERE condicion;

En este caso, asumimos que el número de columnas y valores en el select coincide con el número y tipo de datos de las columnas en la tabla destino. O dicho de otra forma, que la estructura del select es compatible para la operación de inserción.

Ejemplo para insertar registros desde un select

Ahora vamos a ver cómo insertar registros de un select en MySQL con un ejemplo práctico. Supongamos que tenemos dos tablas: clientes y clientes_nuevos. Pero queremos insertar en la tabla clientes_nuevos sólo los clientes que sean de un país específico, por ejemplo, ‘España’.

INSERT INTO clientes_nuevos (nombre, email, pais)
SELECT nombre, email, pais
FROM clientes
WHERE pais = 'España';

En este ejemplo MySQL se realiza la inserción de los registros obtenidos de un select de la siguiente manera:

  • INSERT INTO clientes_nuevos (nombre, email, pais) Indica que se realizará una operación de inserción en la tabla clientes_nuevos. Se especifican las columnas (nombre, email, pais) a las que se insertarán datos.
  • SELECT nombre, email, pais FROM clientes Realiza una selección de datos de las columnas nombre, email y pais desde la tabla clientes. Especifica qué datos se copiarán en las columnas correspondientes de la tabla clientes_nuevos.
  • WHERE pais = 'España' Es una condición que filtra los registros de la tabla clientes para seleccionar solo aquellos cuyo valor en la columna pais sea ‘España’. Sólo los registros que cumplan con esta condición se incluirán en la operación de inserción en la tabla clientes_nuevos.

Índices al insertar registros de un select en MySQL

Una pregunta que nos puede asaltar a la mente es qué pasa con los índices ID ? En este caso la respuesta es muy sencilla, los podemos omitir y MySQL se encarga de crearlos y añadirlos, como en cualquier otro INSERT.

Cuando se realizan operaciones de inserción de datos en una tabla que tiene una columna de índice automático (como un ID autoincremental), los sistemas de gestión de bases de datos generalmente se encargan de gestionar automáticamente el valor de esa columna. De esta forma tenemos que la base de datos se encargará de:

  • Índice Automático: No se necesita proporcionar un valor explícito para la columna id en la sentencia INSERT, ya que el sistema generará automáticamente un nuevo valor.
  • Preservación de la Unicidad: El sistema de gestión de bases de datos garantizará que los valores en la columna id sean únicos, lo que es fundamental para la integridad de la tabla.
  • Incremento Automático: La columna de índice automático se incrementará automáticamente con cada nueva inserción. Este comportamiento asegura que los valores de id sean únicos y secuenciales.

Manipular datos al insertar registros de un select

A veces, necesitamos modificar los datos antes de insertarlos, cosa que se puede conseguir manipulando los datos antes de insertar los registros del select. Supongamos que además de copiar datos de la tabla clientes a clientes_nuevos, también queremos realizar algunas transformaciones y cálculos antes de la inserción.

En este ejemplo, concatenaremos valores, calcularemos la longitud de una cadena y utilizaremos una subconsulta.

INSERT INTO clientes_nuevos (nombre, email, pais, longitud_email)
SELECT 
    CONCAT('Nuevo_', nombre) AS nombre_transformado,
    CONCAT('nuevo_', email) AS email_transformado,
    pais,
    LENGTH(email) AS longitud_email
FROM (
    SELECT nombre, email, pais
    FROM clientes
    WHERE pais = 'España'
) AS subconsulta_clientes_espana;

Explicación del código de inserción

  • INSERT INTO clientes_nuevos (nombre, email, pais, longitud_email) Indica que se realizará una operación de inserción en la tabla clientes_nuevos, especificando las columnas nombre, email, pais y longitud_email en las que se insertarán datos.
  • SELECT Este select obtiene sus datos de una subconsulta y realiza algunas transformaciones a ciertas columnas.
    • CONCAT('Nuevo_', nombre) AS nombre_transformado Crea una nueva columna llamada nombre_transformado en la salida de la consulta. Esta columna consiste en la concatenación de la cadena ‘Nuevo_’ con el valor existente en la columna nombre. Por ejemplo, si el valor original en la columna nombre es ‘Juan’, el valor resultante en la columna nombre_transformado será ‘Nuevo_Juan’.
    • CONCAT('nuevo_', email) AS email_transformado Crea una nueva columna llamada email_transformado en la salida de la consulta. Esta columna consiste en la concatenación de la cadena ‘nuevo_’ con el valor existente en la columna email. Similar al caso anterior, si el valor original en la columna email es ‘juan@example.com‘, el valor resultante en la columna email_transformado será ‘nuevo_juan@example.com‘.
    • pais Incluye la columna pais sin cambios en la salida de la consulta. Esta columna no se ve afectada por ninguna transformación y conserva los valores originales de la tabla.
    • LENGTH(email) AS longitud_email Crea una nueva columna llamada longitud_email en la salida de la consulta. Esta columna contiene la longitud (en número de caracteres) del valor en la columna email. Por ejemplo, si el valor original en la columna email es ‘juan@example.com‘, el valor resultante en la columna longitud_email será la longitud de la cadena, que en este caso sería 16.
  • FROM (SELECT nombre, email, pais FROM clientes WHERE pais = 'España') Con una apertura de paréntesis, FROM nos está indicando que comienza una subconsulta o una expresión más compleja. En este caso es una subconsulta que selecciona los registros de la tabla clientes que cumplen con la condición pais = 'España'. De los datos obtenidos, se realizan varias manipulaciones en la consulta principal. Toda subconsulta debe ser tratada como una tabla temporal, en este caso llamada subconsulta_clientes_espana.

Evitar duplicados al insertar registros de un select

Al insertar registros desde un select en MySQL es posible que estemos tratando con una cantidad de datos muy grande. Aunque utilicemos subconsultas y manipulaciones es posible que aparezcan registros duplicados que no queremos insertar. En este sentido, si queremos evitar la inserción de registros duplicados, podemos usar la cláusula IGNORE.

Supongamos que la tabla clientes_nuevos ya tiene algunos registros y solo queremos insertar nuevos clientes sin duplicados:

INSERT IGNORE INTO clientes_nuevos (nombre, email, pais)
SELECT nombre, email, pais
FROM clientes
WHERE pais = 'España';

Añadiendo la instrucción IGNORE a nuestra consulta select, la inserción de registros continuará incluso si hay conflictos de clave única, omitiendo los registros duplicados.

Conclusiones

Insertar registros desde un select en MySQL es una operación poderosa que nos permite manipular y transferir datos de manera eficiente entre tablas. Al comprender la sintaxis y los ejemplos prácticos de este artículo, podrás realizar estas operaciones de manera efectiva en tu desarrollo de bases de datos con MySQL.

¡ Espero que este artículo sea de vuestro interés !

Deja un comentario