INSERT

La sentencia INSERT añade nuevas filas a una tabla. Es la operación fundamental para introducir datos en MySQL. Junto con SELECT, UPDATE y DELETE, forma el conjunto de operaciones CRUD (Create, Read, Update, Delete) que toda aplicación necesita.

Sintaxis

INSERT INTO tabla (columna1, columna2, ...)
VALUES (valor1, valor2, ...);

Especificas la tabla de destino, las columnas que vas a rellenar y los valores correspondientes. Las columnas que no incluyas recibirán su valor por defecto (normalmente NULL o el default definido en la tabla).

Insertar una fila

Añadir una nueva categoría a la tabla categorias:

INSERT INTO categorias (nombre, descripcion, categoria_padre_id)
VALUES ('Tablets', 'Tablets y accesorios para tablets', 1);
Query OK, 1 row affected (0.01 sec)

No incluimos la columna id porque es AUTO_INCREMENT: MySQL le asigna automáticamente el siguiente valor disponible (17 en este caso, ya que teníamos 16 categorías). La nueva categoría es una subcategoría de Electrónica (categoria_padre_id = 1).

Para verificar la inserción:

SELECT * FROM categorias WHERE nombre = 'Tablets';
idnombredescripcioncategoria_padre_id
17TabletsTablets y accesorios para tablets1

Insertar especificando todas las columnas

Si proporcionas valores para todas las columnas en el orden en que están definidas en la tabla, puedes omitir la lista de columnas:

INSERT INTO categorias
VALUES (18, 'Smartwatches', 'Relojes inteligentes y pulseras', 1);

Aunque funciona, esta forma es frágil: si alguien añade o reordena columnas en la tabla, la sentencia se rompe. Siempre es mejor especificar las columnas explícitamente.

Columnas con valores por defecto

Las columnas que tienen un valor DEFAULT definido o que aceptan NULL pueden omitirse del INSERT. MySQL les asigna automáticamente su valor por defecto.

Insertar un producto sin descripción:

INSERT INTO productos (nombre, precio, stock, categoria_id)
VALUES ('iPad Air', 699.00, 30, 17);

Las columnas descripcion (NULL por defecto), activo (TRUE por defecto), creado_en y actualizado_en (CURRENT_TIMESTAMP por defecto) se rellenan automáticamente. El producto se crea como activo con la fecha actual sin que tengamos que especificarlo.

También puedes usar la palabra DEFAULT explícitamente:

INSERT INTO productos (nombre, descripcion, precio, stock, categoria_id, activo)
VALUES ('Apple Watch SE', 'Smartwatch con GPS', 299.00, 45, 18, DEFAULT);

DEFAULT en la columna activo equivale a TRUE, que es el valor por defecto definido en la tabla.

INSERT con expresiones

Los valores no tienen que ser literales. Puedes usar expresiones y funciones de MySQL:

INSERT INTO pedidos (cliente_id, empleado_id, fecha_pedido, estado, total)
VALUES (1, 4, NOW(), 'pendiente', 699.00 * 1.21);

NOW() inserta la fecha y hora actuales. La expresión 699.00 * 1.21 calcula el precio con IVA. MySQL evalúa las expresiones antes de insertar el resultado.

INSERT IGNORE

Cuando un INSERT viola una restricción (como una clave duplicada o un NOT NULL), MySQL devuelve un error y la operación se cancela. INSERT IGNORE convierte esos errores en advertencias y continúa la ejecución:

INSERT IGNORE INTO clientes (nombre, apellidos, email)
VALUES ('María', 'García López', 'maria.garcia@email.com');
Query OK, 0 rows affected, 1 warning (0.00 sec)

El email maria.garcia@email.com ya existe en la tabla (pertenece a la cliente María García). Sin IGNORE, MySQL devolvería un error de clave duplicada. Con IGNORE, la fila simplemente no se inserta y la ejecución continúa. Esto es especialmente útil cuando insertas múltiples filas y no quieres que un duplicado detenga toda la operación.

Para ver la advertencia:

SHOW WARNINGS;
LevelCodeMessage
Warning1062Duplicate entry 'maria.garcia@email.com' for key

LAST_INSERT_ID()

Después de un INSERT en una tabla con AUTO_INCREMENT, puedes obtener el ID generado con LAST_INSERT_ID():

INSERT INTO categorias (nombre, descripcion)
VALUES ('Música', 'Instrumentos musicales y equipos de sonido');
 
SELECT LAST_INSERT_ID();
LAST_INSERT_ID()
19

LAST_INSERT_ID() devuelve el ID asignado al último INSERT realizado en la conexión actual. Es seguro en entornos concurrentes: cada conexión tiene su propio valor, por lo que no hay conflictos entre inserciones simultáneas de diferentes usuarios.

Este patrón es fundamental cuando necesitas insertar datos relacionados: primero insertas el registro padre, obtienes su ID y después insertas los registros hijos que lo referencian.

Errores comunes

Los errores más frecuentes al usar INSERT son:

Violación de clave primaria o única: intentar insertar un valor duplicado en una columna con restricción UNIQUE o PRIMARY KEY. Solución: usar INSERT IGNORE o ON DUPLICATE KEY UPDATE.

Violación de clave foránea: insertar un valor en una columna de referencia que no existe en la tabla referenciada. Por ejemplo, insertar un producto con categoria_id = 999 cuando esa categoría no existe. Solución: asegurarse de que el registro referenciado existe antes de insertar.

Violación de NOT NULL: no proporcionar un valor para una columna que tiene la restricción NOT NULL y no tiene valor por defecto. Solución: incluir la columna en el INSERT o añadir un valor DEFAULT a la definición de la tabla.

Practica con INSERT

Usa el editor para insertar filas y verificar el resultado:

Simulador SQL
Ctrl+Enter para ejecutar

En el siguiente artículo veremos cómo insertar múltiples filas en una sola sentencia, lo que es mucho más eficiente que ejecutar múltiples INSERTs individuales.

Escrito por Eduardo Lázaro