Lección 8.1: La sentencia INSERT INTO
Hasta ahora, nos hemos centrado en recuperar datos de tablas existentes utilizando la sentencia SELECT. Ahora, comenzaremos a explorar el Lenguaje de Manipulación de Datos (DML), comenzando con cómo agregar nuevos datos a tus tablas utilizando la sentencia INSERT INTO.
La Sintaxis Básica
Hay dos formas principales de usar la sentencia INSERT INTO.
1. Especificando Columnas (Recomendado)
Este es el método más seguro y común. Listas explícitamente las columnas que deseas llenar, seguidas de los valores para esas columnas.
INSERT INTO nombre_tabla (columna1, columna2, columna3)
VALUES (valor1, valor2, valor3);
2. Sin Especificar Columnas
Si estás proporcionando valores para todas las columnas de la tabla en el orden exacto en que fueron definidas, puedes omitir los nombres de las columnas. Sin embargo, esto es menos flexible y puede llevar a errores si la estructura de la tabla cambia.
INSERT INTO nombre_tabla
VALUES (valor1, valor2, valor3, ...);
Reglas Importantes para Insertar Datos
- Tipos de Datos: Los valores que proporciones deben coincidir con el tipo de dato de la columna correspondiente (por ejemplo, no puedes insertar texto en una columna numérica).
- Cadenas y Fechas: Al igual que en la cláusula
WHERE, los valores de cadena (texto) y fecha deben estar entre comillas simples ('). - Números: Los valores numéricos no requieren comillas.
- Valores NULL: Si una columna permite
NULLy no proporcionas un valor para ella, se llenará conNULL(o un valor por defecto si se define uno).
Ejemplos
Ejemplo 1: Insertando un Nuevo Actor
Agreguemos un nuevo actor a la tabla actor en la base de datos Sakila.
INSERT INTO actor (first_name, last_name)
VALUES ('JOHNNY', 'DEPP');
Nota: No especificamos el actor_id porque generalmente es auto-generado por la base de datos.
Ejemplo 2: Insertando en Columnas Específicas
Si tenemos una tabla con muchas columnas pero solo queremos llenar algunas:
INSERT INTO customer (first_name, last_name, email, store_id, address_id)
VALUES ('ALICE', 'JOHNSON', 'alice.j@example.com', 1, 5);
Ejemplo 3: Inserción de Múltiples Filas
La mayoría de las bases de datos modernas permiten insertar múltiples filas en una sola sentencia separando los conjuntos de valores con comas.
INSERT INTO actor (first_name, last_name)
VALUES
('TOM', 'HANKS'),
('MERYL', 'STREEP'),
('LEONARDO', 'DICAPRIO');
Insertando Datos desde Otra Consulta (INSERT INTO ... SELECT)
A veces no necesitas ingresar datos manualmente, sino transferirlos de una tabla a otra (por ejemplo, durante la archivación o generación de informes). Para esto, se utiliza una combinación de INSERT INTO y SELECT.
Sintaxis
INSERT INTO tabla_destino (columna1, columna2, columna3)
SELECT columna_fuente1, columna_fuente2, columna_fuente3
FROM tabla_fuente
WHERE condición;
Flexibilidad en la Formación de Datos
Una característica importante de este comando es que en el bloque SELECT puedes combinar diferentes tipos de valores:
- Valores seleccionados: directamente de la tabla fuente (
columna_fuente1). - Valores calculados: el resultado de fórmulas o funciones (por ejemplo,
amount * 0.1). - Valores constantes: datos fijos que no están en la tabla fuente (por ejemplo, fecha de inserción o un estado como cadena).
Ejemplo: Creando un Archivo de Clientes Inactivos
Supongamos que tenemos una tabla customer_archive, y queremos transferir datos allí desde la tabla principal customer, añadiendo la fecha de archivo y una nota de estado:
INSERT INTO customer_archive (customer_id, full_name, archived_at, status_note)
SELECT
customer_id,
CONCAT(first_name, ' ', last_name), -- Valor calculado (Nombre Completo)
CURRENT_DATE, -- Constante (fecha actual)
'Auto-archivado' -- Constante (etiqueta de texto)
FROM customer
WHERE active = 0;
Nota: El número y orden de las columnas en INSERT INTO deben coincidir estrictamente con el número y orden de las columnas devueltas en el SELECT.
Trabajando con Valores NULL y Valores por Defecto
Al insertar una fila, no siempre necesitas proporcionar un valor para cada columna. La base de datos maneja los valores faltantes de dos maneras: a través de NULL y a través de valores por defecto de columna.
Insertando NULL Explícitamente
Si una columna permite NULL, puedes pasar la palabra clave NULL directamente como valor:
INSERT INTO customer (first_name, last_name, email, store_id, address_id)
VALUES ('BOB', 'SMITH', NULL, 1, 5);
Aquí la columna email se almacenará como NULL, lo que significa "sin valor conocido".
Confiando en Valores por Defecto de Columna
Si una columna tiene un valor DEFAULT definido en el esquema de la tabla, puedes omitirla completamente de la lista de columnas. La base de datos la llenará automáticamente:
INSERT INTO actor (first_name, last_name)
VALUES ('CATE', 'BLANCHETT');
Columnas como actor_id (auto-incremento) y last_update (marca de tiempo por defecto) son pobladas por la base de datos sin ninguna entrada explícita.
Insertando DEFAULT Explícitamente
También puedes usar la palabra clave DEFAULT para activar el valor por defecto de una columna mientras aún listando la columna:
INSERT INTO actor (actor_id, first_name, last_name, last_update)
VALUES (DEFAULT, 'CATE', 'BLANCHETT', DEFAULT);
Esto es útil cuando tu sentencia de inserción lista todas las columnas pero aún deseas que la base de datos maneje algunas específicas.
Conclusiones Clave de esta Lección:
- La sentencia
INSERT INTOse utiliza para agregar nuevas filas a una tabla. - El comando
INSERT INTO ... SELECTpermite copiar datos de una tabla a otra. - En el bloque
SELECT, puedes combinar datos reales de la tabla, campos calculados y constantes. - Se recomienda listar explícitamente los nombres de las columnas para una mejor confiabilidad y legibilidad del código.
- Los valores de cadena y fecha deben estar entre comillas simples.
- Puedes insertar múltiples filas a la vez para mejorar el rendimiento.
- Las columnas con valores
NULLoDEFAULTpueden ser omitidas o pasadas explícitamente utilizando las palabras claveNULLyDEFAULT.
En la próxima lección, veremos cómo modificar registros existentes utilizando la sentencia UPDATE.