Mysql – Insert cogiendo datos con una sentencia select

En este artículo os mostraremos cómo hacer un Insert en una tabla de MySql, cogiendo los datos de una consulta select.

MySql

Dicho de otra manera, haremos un Select donde cogeremos unos datos concretos, y éstos los almacenaremos en otra tabla. Un ejemplo muy típico es ir moviendo datos de una tabla a un histórico:

/* Tabla eliminatorias */
CREATE TABLE eliminatorias (
  id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  nombre VARCHAR(30) NOT NULL,
  fecha DATE,
  activo int(1) DEFAULT 0
)

/* Tabla eliminatorias_historial */
CREATE TABLE eliminatorias_historial (
  id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  nombre VARCHAR(30) NOT NULL,
  fecha DATE,
  activo int(1) DEFAULT 0
)

Las dos tablas tienen los mismos campos. Vamos a pasar los registros de una tabla (eliminatorias) a la otra tabla (eliminatorias_historial) en una sola sentencia. Veamos cómo insertar registros en una tabla cogiendo los datos de otra:

INSERT INTO eliminatorias_historial(id,nombre,fecha,activo)
SELECT id, nombre, fecha, activo FROM eliminatorias WHERE fecha < "2015-05-12"

De este modo, primero se hace el select de eliminatorias, y el resultado se va insertando en la tabla eliminatorias_historial.

Importante: los campos consultados en el select, coincidan con los el Insert. En caso contrario no funcionaria.

Pero el ejemplo no lo dejamos aquí. Imagina que de lo que se copia, queremos que uno de los campos, sea fijo. En este caso, haremos que de lo que se coge de eliminatorias, el campo activo, lo vamos a copiar a eliminatorias_historial con el valor 0. Para todos los registros.

INSERT INTO eliminatorias_historial(id,nombre,fecha,activo)
SELECT id, nombre, fecha, 0 FROM eliminatorias WHERE fecha < "2015-05-12"

Fijaos que en el select, el campo que correspondería a activo, ponemos un 0. El select hace que el campo activo sea siempre 0 cuando lo insertemos.

Espero que con estos dos ejemplos podáis tener un poco más claro cómo hacer un insert de un select en MySql en una sola sentencia.


Más información