Saltar al contenido
Bases de datos con SQL
Todos los cursos Ir al ejercicio →

Insertar, actualizar y borrar

  • ⏱ 60 minutos
  • 📶 Nivel: principiante
  • 🧩 Incluye ejercicio

💡 🎯 Al terminar esta lección podrás…

  • Añadir filas con INSERT INTO, una o varias a la vez.
  • Modificar y borrar filas con UPDATE y DELETE usando siempre WHERE.
  • Usar transacciones (BEGIN, COMMIT, ROLLBACK) para trabajar con seguridad.
  • Elegir tipos de datos y entender cómo las restricciones rechazan datos incorrectos.

1.INSERT: añadir filas

INSERT INTO añade una fila nueva. Indicas la tabla, las columnas que vas a rellenar y los valores en el mismo orden.

Insertar un producto
INSERT INTO productos (nombre, categoria, precio, stock)
VALUES ('Alfombrilla', 'Accesorios', 19.90, 60);

La tabla después del INSERT (solo la fila nueva)

idnombrecategoriapreciostock
9AlfombrillaAccesorios19.9060

Puedes insertar varias filas con una sola instrucción, separando las tuplas con comas:

Varias filas a la vez
INSERT INTO productos (nombre, categoria, precio)
VALUES ('Micrófono', 'Audio', 75.00),
       ('Hub USB', 'Accesorios', 29.50);

Filas nuevas después del segundo INSERT

idnombrecategoriapreciostock
9AlfombrillaAccesorios19.9060
10MicrófonoAudio75.000
11Hub USBAccesorios29.500

📌 Nota · Para qué sirve la omisión de stock

Como no indicamos stock, ambas filas lo tienen en 0 gracias al DEFAULT 0 de la tabla. Es una de las ventajas de definir bien las columnas.

2.UPDATE: modificar filas

UPDATE cambia valores de filas que ya existen. SET indica las columnas nuevas y WHERE qué filas se cambian.

Subir un 10 % los precios de Audio
UPDATE productos
SET precio = ROUND(precio * 1.10, 2)
WHERE categoria = 'Audio';

Resultado esperado (incluye el Micrófono insertado antes)

idnombrecategoriaprecio
4AuricularesAudio98.89
6AltavozAudio108.90
10MicrófonoAudio82.50

Puedes cambiar varias columnas a la vez separándolas con comas, y el valor nuevo puede calcularse a partir del actual:

Varias columnas
UPDATE productos
SET stock = 20,
    categoria = 'Audio'
WHERE id = 4;

⚠️ Importante · Sin WHERE se cambian TODAS las filas

UPDATE productos SET precio = 0; pone a cero el precio de cada producto, y SQL no pregunta «¿seguro?». Es el error más caro de un principiante. Escribe primero el WHERE, o prueba con un SELECT que lleve la misma condición.

3.DELETE: borrar filas

DELETE FROM elimina filas completas. Igual que en UPDATE, el WHERE decide cuáles; sin WHERE se borra toda la tabla (la tabla sigue existiendo, pero vacía).

Borrar los productos sin stock
DELETE FROM productos
WHERE stock = 0;

Antes de borrar, mira qué filas serían afectadas con un SELECT de la misma condición:

Primero mirar, luego borrar
SELECT id, nombre, stock FROM productos WHERE stock = 0;   -- ¿son estas?
DELETE FROM productos WHERE stock = 0;                    -- sí: bórralas

En nuestra tabla, el SELECT previo (tras dejar con stock 20 al producto 4, como hicimos arriba) devolvería los productos sin stock que insertamos (Micrófono y Hub USB):

Filas que borraría (comprobación con SELECT)

idnombrestock
10Micrófono0
11Hub USB0

Y después de borrar queda:

La tabla después de borrar

idnombrestock
1Teclado15
2Ratón40
3Monitor FHD8
4Auriculares20
5Webcam12
6Altavoz25
7Monitor 4K3
8Cable HDMI100
9Alfombrilla60

⚠️ Importante · Borrar no se deshace

Salvo que uses una transacción (apartado siguiente) o tengas una copia de seguridad, una fila borrada se pierde. En aplicaciones reales muchas veces se prefiere un «borrado lógico»: una columna activo o eliminado_en en lugar de DELETE.

4.Trabajar con red: transacciones

Una transacción agrupa instrucciones para que se apliquen todas o ninguna. Empieza con BEGIN y termina con COMMIT (confirmar) o ROLLBACK (deshacer). Funciona igual en SQLite y PostgreSQL.

Probar un cambio sin riesgo
BEGIN;

DELETE FROM productos;              -- ¡ups, sin WHERE!
SELECT COUNT(*) FROM productos;     -- 0 filas

ROLLBACK;                           -- se deshace todo
SELECT COUNT(*) FROM productos;     -- las filas siguen ahí

Otro detalle práctico: INSERT, UPDATE y DELETE admiten RETURNING, que devuelve las filas afectadas. Funciona en PostgreSQL y en SQLite 3.35 o posterior.

RETURNING
INSERT INTO productos (nombre, categoria, precio)
VALUES ('Soporte', 'Accesorios', 25.00)
RETURNING id, nombre;

💡 Consejo · Hábito recomendado

Antes de cualquier UPDATE o DELETE a mano en una base de datos que importa: 1) escribe el SELECT con la misma condición, 2) abre una transacción con BEGIN, 3) ejecuta el cambio, 4) revisa y 5) COMMIT o ROLLBACK.

5.Tipos de datos

Cada columna tiene un tipo que define qué valores admite. Los nombres cambian algo entre motores:

Qué guardaSQLitePostgreSQL
Números enterosINTEGERINTEGER, BIGINT
TextoTEXTTEXT, VARCHAR(n)
Decimales exactos (dinero)NUMERICNUMERIC(10, 2)
Decimales aproximadosREALDOUBLE PRECISION
Verdadero / falsoenteros 0 y 1 (acepta TRUE/FALSE desde 3.23)BOOLEAN
Fechas y horastexto '2026-10-06' (con funciones de fecha)DATE, TIMESTAMP

⚠️ Importante · SQLite es flexible; PostgreSQL es estricto

SQLite usa tipado flexible: en una columna INTEGER aceptaría un texto si no puede convertirlo. PostgreSQL rechaza el valor con un error. Para que tu código funcione en ambos, escribe siempre valores del tipo correcto.

💡 Consejo · El dinero no se guarda en REAL

Los decimales aproximados acumulan errores (0.1 + 0.2 no es exactamente 0.3). Para dinero usa NUMERIC con precisión fija o guarda enteros en céntimos (1999 para 19,99).

Las fechas se escriben como texto en formato 'AAAA-MM-DD' y las horas como 'AAAA-MM-DD HH:MM:SS', de modo que ordenarlas alfabéticamente también las ordena cronológicamente.

6.Las restricciones te protegen

Las restricciones (constraints) son reglas de la tabla que la base de datos hace cumplir al insertar o modificar. Nuestra tabla productos ya tiene algunas: PRIMARY KEY, NOT NULL y DEFAULT. Si una instrucción las rompe, no se aplica y recibes un error:

Falta el nombre (columna NOT NULL)
INSERT INTO productos (categoria, precio)
VALUES ('Audio', 10);
Error en SQLite
NOT NULL constraint failed: productos.nombre
Id repetido (clave primaria)
INSERT INTO productos (id, nombre, categoria, precio)
VALUES (1, 'Duplicado', 'Audio', 10);
Error en SQLite
UNIQUE constraint failed: productos.id

PostgreSQL redacta los mensajes de otra forma («null value in column "nombre" … violates not-null constraint», «duplicate key value violates unique constraint»), pero el efecto es el mismo: la fila no entra. Un error de este tipo no es un fallo tuyo: es la base de datos haciendo su trabajo y evitando que se guarden datos incorrectos.

En la lección 4 aprenderás a definir tus propias restricciones: NOT NULL, UNIQUE, CHECK y más.

7.Pruébalo: simulador de cambios

Elige una operación y púlsala. La tabla muestra qué filas se añaden (verde), cambian (naranja) o se borran (tachadas). Prueba también a marcar «Olvidar el WHERE» para ver el desastre sin riesgo. (Es una simulación en tu navegador; no ejecuta SQL real.)

🛠️ Simulador de INSERT, UPDATE y DELETE

    

Elige una operación y pulsa Ejecutar.

idnombrecategoriapreciostock

8.Errores frecuentes

📒 Apuntes para llevar

  • INSERT INTO tabla (columnas) VALUES (valores); añade filas; se pueden insertar varias a la vez.
  • UPDATE tabla SET col = valor WHERE condición; modifica; DELETE FROM tabla WHERE condición; borra.
  • Sin WHERE, UPDATE y DELETE afectan a todas las filas.
  • Prueba la condición con un SELECT y, si importa, trabaja dentro de una transacción: BEGIN … COMMIT/ROLLBACK.
  • Los tipos básicos son INTEGER, TEXT, NUMERIC, REAL, booleanos y fechas; SQLite es flexible y PostgreSQL estricto.
  • Las restricciones (PRIMARY KEY, NOT NULL, DEFAULT…) rechazan datos incorrectos.
  • Los textos van entre comillas simples y los apóstrofos se duplican.

9.Glosario

TérminoSignificado
INSERTInstrucción que añade una o varias filas nuevas a una tabla.
UPDATEInstrucción que modifica valores de filas existentes.
DELETEInstrucción que elimina filas de una tabla.
Restricción (constraint)Regla de la tabla que la base de datos hace cumplir (NOT NULL, UNIQUE, CHECK…).
Valor por defectoValor que recibe una columna si no se indica (DEFAULT).
TransacciónGrupo de instrucciones que se aplican todas o ninguna (BEGIN, COMMIT, ROLLBACK).
Tipo de datoClase de valores que admite una columna: entero, texto, decimal, fecha…

🧠 Comprueba lo aprendido

Elige una respuesta en cada pregunta. Verás al instante si acertaste y por qué.

¿Qué pasa si ejecutas DELETE FROM productos; (sin WHERE)?

¿Cuál es la forma correcta de añadir una fila?

¿Qué hace ROLLBACK?

Insertas una fila sin indicar el nombre, que es NOT NULL y no tiene valor por defecto. ¿Qué ocurre?

¿Qué tipo es más seguro para guardar importes de dinero?

Tu progreso se guarda en este navegador y se refleja en el índice del curso.

💡 🚀 ¡Ahora te toca!

La práctica fija lo aprendido. Pasa al ejercicio de esta lección.

Ir al ejercicio