Insertar, actualizar y borrar
💡 🎯 Al terminar esta lección podrás…
- Añadir filas con
INSERT INTO, una o varias a la vez. - Modificar y borrar filas con
UPDATEyDELETEusando siempreWHERE. - 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.
INSERT INTO productos (nombre, categoria, precio, stock)
VALUES ('Alfombrilla', 'Accesorios', 19.90, 60);
La tabla después del INSERT (solo la fila nueva)
| id | nombre | categoria | precio | stock |
|---|---|---|---|---|
| 9 | Alfombrilla | Accesorios | 19.90 | 60 |
- No hemos escrito
id: en SQLite una columnaINTEGER PRIMARY KEYse numera sola (aquí,9). En PostgreSQL esto requiere declarar la columna comoGENERATED ALWAYS AS IDENTITY(lo verás en la lección 4). - Las columnas que no menciones reciben su valor por defecto (
DEFAULT) oNULL. Así,stockvaldrá0si lo omites. - Escribe siempre la lista de columnas: el código seguirá funcionando si algún día la tabla cambia.
Puedes insertar varias filas con una sola instrucción, separando las tuplas con comas:
INSERT INTO productos (nombre, categoria, precio)
VALUES ('Micrófono', 'Audio', 75.00),
('Hub USB', 'Accesorios', 29.50);
Filas nuevas después del segundo INSERT
| id | nombre | categoria | precio | stock |
|---|---|---|---|---|
| 9 | Alfombrilla | Accesorios | 19.90 | 60 |
| 10 | Micrófono | Audio | 75.00 | 0 |
| 11 | Hub USB | Accesorios | 29.50 | 0 |
📌 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.
UPDATE productos
SET precio = ROUND(precio * 1.10, 2)
WHERE categoria = 'Audio';
Resultado esperado (incluye el Micrófono insertado antes)
| id | nombre | categoria | precio |
|---|---|---|---|
| 4 | Auriculares | Audio | 98.89 |
| 6 | Altavoz | Audio | 108.90 |
| 10 | Micrófono | Audio | 82.50 |
Puedes cambiar varias columnas a la vez separándolas con comas, y el valor nuevo puede calcularse a partir del actual:
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).
DELETE FROM productos
WHERE stock = 0;
Antes de borrar, mira qué filas serían afectadas con un SELECT de la misma condición:
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)
| id | nombre | stock |
|---|---|---|
| 10 | Micrófono | 0 |
| 11 | Hub USB | 0 |
Y después de borrar queda:
La tabla después de borrar
| id | nombre | stock |
|---|---|---|
| 1 | Teclado | 15 |
| 2 | Ratón | 40 |
| 3 | Monitor FHD | 8 |
| 4 | Auriculares | 20 |
| 5 | Webcam | 12 |
| 6 | Altavoz | 25 |
| 7 | Monitor 4K | 3 |
| 8 | Cable HDMI | 100 |
| 9 | Alfombrilla | 60 |
⚠️ 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.
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í
- Si el resultado es el esperado, termina con
COMMIT;y los cambios se guardan. - Si algo falla,
ROLLBACK;devuelve la base de datos al estado deBEGIN. - Útil también cuando varios cambios dependen entre sí: por ejemplo, restar stock y registrar el pedido deben ocurrir juntos.
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.
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é guarda | SQLite | PostgreSQL |
|---|---|---|
| Números enteros | INTEGER | INTEGER, BIGINT |
| Texto | TEXT | TEXT, VARCHAR(n) |
| Decimales exactos (dinero) | NUMERIC | NUMERIC(10, 2) |
| Decimales aproximados | REAL | DOUBLE PRECISION |
| Verdadero / falso | enteros 0 y 1 (acepta TRUE/FALSE desde 3.23) | BOOLEAN |
| Fechas y horas | texto '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:
INSERT INTO productos (categoria, precio)
VALUES ('Audio', 10);
NOT NULL constraint failed: productos.nombre
INSERT INTO productos (id, nombre, categoria, precio)
VALUES (1, 'Duplicado', 'Audio', 10);
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.)
8.Errores frecuentes
- Olvidar el
WHEREenUPDATEoDELETE: afecta a todas las filas. Escribe primero la condición o ensaya conSELECT. - Poner los valores en distinto orden que las columnas en un
INSERT: el precio acaba en el stock. Revisa que cada valor coincida con su columna. - Texto sin comillas simples en los
VALUES:VALUES (Teclado, …)da error; debe ser'Teclado'. - Un apóstrofo dentro del texto:
'L'Oréal'rompe la instrucción; se duplica:'L''Oréal'. - Guardar dinero en
REAL: acumula errores de redondeo. UsaNUMERICo céntimos enteros. - Insertar un id que ya existe: provoca un error de clave duplicada. Deja que el motor numere solo.
- Creer que un error rompió la base de datos: si una instrucción falla, no se aplica y todo sigue como estaba.
📒 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,UPDATEyDELETEafectan a todas las filas. - Prueba la condición con un
SELECTy, 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érmino | Significado |
|---|---|
| INSERT | Instrucción que añade una o varias filas nuevas a una tabla. |
| UPDATE | Instrucción que modifica valores de filas existentes. |
| DELETE | Instrucció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 defecto | Valor que recibe una columna si no se indica (DEFAULT). |
| Transacción | Grupo de instrucciones que se aplican todas o ninguna (BEGIN, COMMIT, ROLLBACK). |
| Tipo de dato | Clase 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)?
Sin WHERE se eliminan todas las filas. Para borrar la tabla en sí se usa DROP TABLE (lección 4).
¿Cuál es la forma correcta de añadir una fila?
La forma es INSERT INTO tabla (columnas) VALUES (valores);, con el texto entre comillas simples.
¿Qué hace ROLLBACK?
ROLLBACK cancela la transacción y devuelve los datos a su estado anterior; COMMIT es el que confirma.
Insertas una fila sin indicar el nombre, que es NOT NULL y no tiene valor por defecto. ¿Qué ocurre?
Las restricciones impiden guardar datos incorrectos: la fila no entra y recibes un error.
¿Qué tipo es más seguro para guardar importes de dinero?
Los decimales aproximados acumulan errores de redondeo; NUMERIC o los céntimos enteros son exactos.
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.