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';| id | nombre | descripcion | categoria_padre_id |
|---|---|---|---|
| 17 | Tablets | Tablets y accesorios para tablets | 1 |
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;| Level | Code | Message |
|---|---|---|
| Warning | 1062 | Duplicate 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:
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
