⏳ ¡Últimos días de octubre! SQLtest.online es gratuito gracias a las donaciones, y aún necesitamos alcanzar la meta de este mes para que el sitio siga funcionando en noviembre. Cada donación cuenta. Apoyar ahora →
Código SQL copiado al portapapeles

SQL INSERT INTO: agregar filas a una tabla

Lección 8.1 · Tiempo de lectura: ~7 min · Tareas de práctica ↓

La sentencia SQL INSERT INTO agrega filas nuevas a una tabla. En esta lección aprenderás la sintaxis de INSERT, por qué conviene listar siempre las columnas, cómo insertar varias filas a la vez, cómo copiar datos con INSERT INTO ... SELECT y cómo se completan las columnas NULL, DEFAULT y autoincrementales.

Hasta ahora, todas las consultas de este curso leían datos con SELECT. Con este módulo empiezas a modificar datos. INSERT, UPDATE y DELETE forman el lenguaje de manipulación de datos (DML); INSERT es el que crea filas nuevas.

Las bases de datos de ejemplo de SQLtest son de solo lectura, así que allí estas sentencias devuelven un error de permisos. Los ejemplos usan el esquema Sakila para mostrar la sintaxis y las reglas que aplica una base de datos real.

SQL INSERT INTO: una lista de columnas y una lista VALUES que se emparejan por posición, autoincremento y valores por defecto para las columnas omitidas, e INSERT INTO ... SELECT

Sintaxis de INSERT

Con lista de columnas (recomendado)

INSERT INTO table_name (column1, column2, column3)
VALUES (value1, value2, value3);

Los valores se emparejan con las columnas por posición: el primer valor va a la primera columna de la lista, y así sucesivamente. Las columnas que no están en la lista reciben su valor por defecto o NULL.

Sin lista de columnas

INSERT INTO table_name
VALUES (value1, value2, value3, ...);

Aquí hay que dar un valor para cada columna, en el orden en que se definieron en la tabla. Si alguien agrega una columna más adelante, la sentencia falla o, peor, guarda valores en las columnas equivocadas. En el código que se guarda y se reutiliza, lista siempre las columnas.


Insertar una fila

INSERT INTO actor (first_name, last_name)
VALUES ('JOHNNY', 'DEPP');

Resultado: un actor nuevo. actor_id se completa automáticamente (autoincremento), y last_update recibe la hora actual de su valor por defecto.

Las reglas para los valores son las mismas que en WHERE: texto y fechas entre comillas simples, números sin comillas.


Columnas obligatorias

A una columna definida como NOT NULL sin valor por defecto hay que darle un valor. En Sakila, customer.create_date es una columna así:

-- Error: Field 'create_date' doesn't have a default value
INSERT INTO customer (store_id, first_name, last_name, email, address_id)
VALUES (1, 'ALICE', 'JOHNSON', 'alice.j@example.com', 5);
-- Correcto: la columna obligatoria tiene un valor
INSERT INTO customer (store_id, first_name, last_name, email, address_id, create_date)
VALUES (1, 'ALICE', 'JOHNSON', 'alice.j@example.com', 5, NOW());

Resultado: un cliente nuevo de la tienda 1. customer_id se genera solo, y active recibe su valor por defecto 1.

Los valores también deben cumplir las claves foráneas: store_id = 1 y address_id = 5 tienen que existir en las tablas store y address; si no, la base de datos rechaza la fila.


Insertar varias filas

Varias listas de valores separadas por comas insertan varias filas en una sola sentencia:

INSERT INTO actor (first_name, last_name)
VALUES ('TOM', 'HANKS'),
       ('MERYL', 'STREEP'),
       ('LEONARDO', 'DICAPRIO');

Resultado: tres actores nuevos.

Una sentencia de varias filas es mucho más rápida que muchas de una sola fila: la base de datos la analiza una vez y escribe los cambios de una sola vez. Es la forma estándar de cargar datos por lotes.


Valores NULL y DEFAULT

NULL guarda "sin valor" en una columna que lo admite:

INSERT INTO customer (store_id, first_name, last_name, email, address_id, create_date)
VALUES (1, 'BOB', 'SMITH', NULL, 5, NOW());

Resultado: un cliente sin dirección de correo.

Omitir una columna la completa con su valor por defecto, o con NULL si no tiene uno.

DEFAULT pide el valor por defecto de forma explícita, lo que es práctico cuando se listan todas las columnas:

INSERT INTO actor (actor_id, first_name, last_name, last_update)
VALUES (DEFAULT, 'CATE', 'BLANCHETT', DEFAULT);

Resultado: actor_id recibe el siguiente número de autoincremento, y last_update la hora actual.


INSERT INTO ... SELECT

En lugar de VALUES, un INSERT puede tomar sus filas de una consulta. Así se copian datos entre tablas, se archivan o se cargan tablas de informes:

INSERT INTO target_table (column1, column2, column3)
SELECT source_column1, source_column2, source_column3
FROM source_table
WHERE condition;

La lista del SELECT puede combinar columnas, cálculos y constantes. Por ejemplo, si existe una tabla customer_archive, se pueden copiar en ella los clientes inactivos:

INSERT INTO customer_archive (customer_id, full_name, archived_at, status_note)
SELECT customer_id,
       CONCAT(first_name, ' ', last_name),
       CURRENT_DATE,
       'Auto-archived'
FROM customer
WHERE active = 0;

Resultado: 15 filas, una por cliente inactivo, con el nombre completo, la fecha de hoy y una nota fija.

La cantidad y el orden de las columnas del SELECT deben coincidir con la lista de columnas del INSERT. Los nombres de las columnas no tienen que coincidir; las posiciones, sí.


Errores comunes de INSERT

ErrorCausa
Column count doesn't match value countLa lista de valores y la lista de columnas tienen distinta longitud
Field '…' doesn't have a default valueSe omitió una columna NOT NULL sin valor por defecto
Duplicate entry '…' for key 'PRIMARY'El valor de la clave ya existe
Cannot add or update a child row: a foreign key constraint failsNo existe una fila referenciada
Incorrect … valueUn valor no corresponde al tipo de dato de la columna

Conclusiones clave:

  • INSERT INTO table (columns) VALUES (values) agrega una fila; los valores se emparejan con las columnas por posición.
  • Lista siempre las columnas: así la sentencia sobrevive a los cambios en la tabla.
  • A las columnas NOT NULL sin valor por defecto hay que darles un valor; las claves foráneas deben apuntar a filas existentes.
  • Una sentencia puede insertar muchas filas: VALUES (...), (...), (...).
  • INSERT INTO ... SELECT inserta el resultado de una consulta.
  • Las columnas omitidas reciben su valor por defecto o NULL; la palabra clave DEFAULT pide el valor por defecto de forma explícita.

Preguntas frecuentes

¿Cómo inserto varias filas en SQL?

Escribe varios grupos de valores después de VALUES, separados por comas: INSERT INTO actor (first_name, last_name) VALUES ('TOM', 'HANKS'), ('MERYL', 'STREEP');. Funciona en MySQL, MariaDB, PostgreSQL, SQL Server y SQLite.

¿Cómo copio filas de una tabla a otra?

Usa INSERT INTO target (columns) SELECT columns FROM source WHERE condition;. El SELECT debe devolver la misma cantidad de columnas, en el mismo orden, que la lista de columnas de la tabla de destino.

¿Qué pasa con las columnas que no listo en INSERT?

Reciben su valor por defecto. Una clave autoincremental recibe el siguiente número. Si una columna no tiene valor por defecto, recibe NULL, o la sentencia falla si la columna es NOT NULL.

Intenta resolver las siguientes tareas para reforzar lo que aprendiste en esta lección.

  1. Agregar Registro de Dirección
  2. Nueva Entrada de Registro de Personal
  3. Crear Tabla de Islas