Bienvenida
Una base de datos correctamente diseñada todavía necesita operaciones seguras. Los productos cambian de precio, los pacientes actualizan su teléfono, las existencias aumentan y disminuyen, y algunos registros deben retirarse.
Modificar datos es una tarea de mayor riesgo que consultarlos. Una consulta incorrecta puede mostrar un resultado equivocado; una actualización incorrecta puede alterar miles de filas. Una eliminación ejecutada sin cuidado puede destruir información que no se puede reconstruir.
En este módulo aprenderás a trabajar con datos de forma controlada. Antes de ejecutar un cambio, comprobarás qué filas serán afectadas. Cuando varias instrucciones formen una sola operación, las protegerás mediante una transacción.
Principio del módulo: una modificación profesional se prepara, se comprueba, se ejecuta y se verifica. Nunca se lanza a ciegas.
Objetivos de aprendizaje
Al completar el módulo serás capaz de:
- Explicar el ciclo CRUD y diferenciar sus cuatro operaciones.
- Insertar uno o varios registros mediante
INSERT. - Utilizar listas explícitas de columnas en las inserciones.
- Aplicar correctamente valores predeterminados y
NULL. - Interpretar errores producidos por restricciones.
- Modificar una o varias columnas mediante
UPDATE. - Utilizar
WHEREpara dirigir un cambio a filas concretas. - Eliminar registros específicos mediante
DELETE. - Diferenciar
DELETEdeDROP TABLE. - Comprobar el alcance de una modificación antes y después de ejecutarla.
- Respetar el orden de las operaciones cuando existen claves foráneas.
- Explicar el propósito de una transacción.
- Utilizar
BEGIN,COMMITyROLLBACK. - Probar operaciones peligrosas sin conservar los cambios.
- Agrupar varias instrucciones como una unidad indivisible.
- Recuperar el estado anterior cuando una operación no debe confirmarse.
- Preparar scripts reproducibles de carga y mantenimiento.
- Crear evidencias claras de una operación confirmada y una revertida.
Producto que construirás
El proyecto principal será un inventario con historial de movimientos:
inventario.db
├── categorias
├── productos
└── movimientoscategorias ||────o{ productos ||────o{ movimientosLa tabla productos conservará la existencia actual. La tabla movimientos registrará por qué cambió esa existencia.
Una entrada o salida de inventario requerirá dos cambios relacionados:
1. Actualizar la existencia del producto.
2. Registrar el movimiento.Si una de las dos instrucciones falla, ninguna debe conservarse. Esa necesidad se resolverá mediante una transacción.
Ruta de trabajo y distribución del tiempo
| Actividad | Tiempo aproximado |
|---|---|
| Explicaciones y demostraciones | 35 minutos |
| Prácticas guiadas | 40 minutos |
| Ejercicios individuales y corrección de errores | 30 minutos |
| Mini proyecto: caja diaria de una cafetería | 20 minutos |
| Proyecto del módulo: inventario y movimientos de existencias | 70 minutos |
| Evaluación y preparación de la entrega | 15 minutos |
| Total | 3 horas y 30 minutos |
Los tiempos son orientativos. Una práctica de modificación puede repetirse en una copia de la base hasta comprender exactamente qué ocurrió.
El ciclo CRUD
1 Los datos tienen un ciclo de vida
Un registro no permanece necesariamente igual desde que se crea.
Ejemplo de un producto:
Se registra
↓
Se consulta
↓
Se corrige o actualiza
↓
Puede retirarseLas cuatro operaciones se conocen como CRUD:
| Letra | Palabra | Operación SQL principal | Propósito |
|---|---|---|---|
| C | Create | INSERT | Crear un registro |
| R | Read | SELECT | Leer registros |
| U | Update | UPDATE | Modificar registros |
| D | Delete | DELETE | Eliminar registros |
En CRUD, “Create” significa crear datos mediante INSERT. No debe confundirse con CREATE TABLE, que crea una estructura.
2 CRUD no define por sí solo un procedimiento seguro
Saber la instrucción no basta. Antes de cambiar datos debes responder:
- ¿Cuál es la base correcta?
- ¿Cuál es la tabla correcta?
- ¿Qué fila o filas deben cambiar?
- ¿Cuál debe ser el estado final?
- ¿Qué reglas podrían rechazar el cambio?
- ¿Hay otras tablas relacionadas?
- ¿Cómo se comprobará el resultado?
- ¿Cómo se recuperará el estado anterior si algo sale mal?
3 Escenario de práctica
Durante las demostraciones utilizarás:
PRAGMA foreign_keys = ON;
CREATE TABLE categorias (
id INTEGER PRIMARY KEY,
nombre TEXT NOT NULL UNIQUE
);
CREATE TABLE productos (
id INTEGER PRIMARY KEY,
codigo TEXT NOT NULL UNIQUE,
nombre TEXT NOT NULL,
precio REAL NOT NULL CHECK (precio > 0),
stock INTEGER NOT NULL DEFAULT 0 CHECK (stock >= 0),
activo INTEGER NOT NULL DEFAULT 1 CHECK (activo IN (0, 1)),
descripcion TEXT,
categoria_id INTEGER NOT NULL,
FOREIGN KEY (categoria_id)
REFERENCES categorias(id)
ON UPDATE CASCADE
ON DELETE RESTRICT
);Carga inicial:
INSERT INTO categorias (id, nombre)
VALUES
(1, 'Papelería'),
(2, 'Tecnología'),
(3, 'Accesorios');
INSERT INTO productos (
id,
codigo,
nombre,
precio,
stock,
descripcion,
categoria_id
) VALUES
(1, 'PAP-001', 'Cuaderno profesional', 4.50, 20, 'Cuaderno de 100 páginas', 1),
(2, 'TEC-010', 'Memoria USB 32 GB', 9.90, 12, NULL, 2),
(3, 'ACC-006', 'Soporte para teléfono', 7.25, 8, 'Soporte ajustable', 3),
(4, 'PAP-014', 'Marcador negro', 1.20, 35, NULL, 1);Conserva una copia de esta base para repetir las prácticas.
Insertar datos profesionalmente
1 Inserción de una fila
INSERT INTO productos (
id,
codigo,
nombre,
precio,
stock,
descripcion,
categoria_id
) VALUES (
5,
'TEC-021',
'Teclado compacto',
24.90,
6,
'Teclado con conexión USB',
2
);La lista de columnas y la lista de valores deben tener la misma cantidad y el mismo orden.
2 Por qué debes escribir las columnas
Evita:
INSERT INTO productos
VALUES (5, 'TEC-021', 'Teclado compacto', 24.90, 6, 1, NULL, 2);Aunque pueda funcionar si conoces exactamente el orden del esquema, resulta difícil de leer y puede romperse si la estructura cambia.
Prefiere:
INSERT INTO productos (
id,
codigo,
nombre,
precio,
stock,
categoria_id
) VALUES (
5,
'TEC-021',
'Teclado compacto',
24.90,
6,
2
);Las columnas omitidas utilizarán su valor predeterminado o NULL cuando la estructura lo permita.
En este caso:
activorecibe 1 porDEFAULT.descripcionrecibeNULL.
3 Inserción de varias filas
INSERT INTO productos (
id,
codigo,
nombre,
precio,
stock,
categoria_id
) VALUES
(6, 'PAP-020', 'Carpeta azul', 2.10, 18, 1),
(7, 'ACC-011', 'Cable organizador', 3.75, 25, 3),
(8, 'TEC-030', 'Ratón inalámbrico', 16.50, 10, 2);La inserción múltiple es útil para datos iniciales. Si una fila viola una restricción, la instrucción puede fallar; revisa todo el conjunto antes de ejecutarlo.
4 Valores predeterminados
Un valor predeterminado se utiliza cuando la columna se omite:
activo INTEGER NOT NULL DEFAULT 1INSERT INTO productos (
id,
codigo,
nombre,
precio,
categoria_id
) VALUES (
9,
'PAP-025',
'Regla de 30 cm',
1.10,
1
);Resultado esperado:
stock = 0
activo = 1
descripcion = NULLDEFAULT no se utiliza si proporcionas explícitamente otro valor.
5 NULL debe representar una ausencia legítima
Utiliza NULL si una descripción todavía no existe:
descripcion = NULLNo utilices NULL para evitar investigar datos obligatorios como código, nombre o categoría.
6 Orden de inserción con claves foráneas
1. Insertar categoría.
2. Insertar producto que la referencia.Una fila hija no puede hacer referencia a una fila padre inexistente.
Incorrecto:
INSERT INTO productos (
id,
codigo,
nombre,
precio,
stock,
categoria_id
) VALUES (
10,
'MOB-001',
'Silla ergonómica',
85.00,
2,
99
);Si no existe la categoría 99 y las claves foráneas están activas, SQLite rechaza la inserción.
7 Los errores de integridad protegen los datos
Posibles mensajes:
UNIQUE constraint failed
NOT NULL constraint failed
CHECK constraint failed
FOREIGN KEY constraint failedNo intentes “resolver” el error desactivando la restricción. Busca la causa:
- ¿Se repitió un código?
- ¿Falta un valor obligatorio?
- ¿El precio es inválido?
- ¿La categoría no existe?
Práctica guiada 1 — Inserciones válidas e inválidas
- Crea una copia de la base de práctica.
- Inserta el producto con
id5. - Comprueba los valores predeterminados.
- Intenta repetir
TEC-021con otro identificador. - Intenta insertar un precio negativo.
- Intenta utilizar una categoría inexistente.
- Registra qué restricción rechazó cada caso.
- Conserva solamente los datos válidos.
Modificar datos con UPDATE
1 Anatomía de una actualización
UPDATE productos
SET precio = 5.25
WHERE id = 1;Lectura:
En la tabla productos,
establece precio en 5.25,
solamente para la fila cuyo id es 1.2 WHERE define qué filas cambian
Sin WHERE:
UPDATE productos
SET precio = 5.25;La instrucción modifica el precio de todas las filas.
En este módulo no ejecutarás actualizaciones sin WHERE sobre datos del proyecto.
3 Procedimiento seguro de actualización
Paso 1. Describe el cambio
Cambiar el precio del producto con
id1 de 4.50 a 5.25.
Paso 2. Consulta la fila objetivo
SELECT id, codigo, nombre, precio
FROM productos
WHERE id = 1;Paso 3. Comprueba el identificador
Verifica que el resultado corresponda al producto correcto.
Paso 4. Ejecuta el cambio
UPDATE productos
SET precio = 5.25
WHERE id = 1;Paso 5. Vuelve a consultar
SELECT id, codigo, nombre, precio
FROM productos
WHERE id = 1;Paso 6. Comprueba otras filas
Revisa la tabla y confirma que no cambió otro producto.
Consultar → comprobar → actualizar → volver a consultar4 Modificar varias columnas
UPDATE productos
SET
precio = 8.50,
descripcion = 'Soporte metálico ajustable'
WHERE id = 3;Las asignaciones se separan mediante comas.
5 Utilizar el valor actual
UPDATE productos
SET stock = stock + 5
WHERE id = 2;La expresión toma el valor actual y le suma cinco.
Si el stock era 12, el resultado será 17.
Para una salida:
UPDATE productos
SET stock = stock - 3
WHERE id = 2;La restricción CHECK (stock >= 0) evita una existencia negativa, pero no sustituye la revisión previa.
6 Actualizar a NULL
UPDATE productos
SET descripcion = NULL
WHERE id = 3;Solo es válido si la columna permite NULL y la ausencia representa una situación real.
7 Una condición puede afectar cero filas
UPDATE productos
SET precio = 12.00
WHERE id = 999;No siempre aparece un error. Si no existe la fila 999, no se actualiza ninguna fila.
Por eso debes consultar y comprobar antes y después.
8 Actualizar una clave relacionada
Modificar claves primarias no debe ser una operación habitual. Si una relación declara ON UPDATE CASCADE, el cambio puede propagarse. Si utiliza RESTRICT, puede rechazarse.
Los datos descriptivos se actualizan con frecuencia. Las identidades deberían permanecer estables.
Práctica guiada 2 — Corregir un producto
Situación:
El producto
ACC-006conserva el mismo código, pero su nombre correcto es “Soporte metálico para teléfono”, su precio es 8.50 y la descripción anterior ya no es válida.
Realiza:
- Consulta la fila por su identificador.
- Confirma el código.
- Actualiza nombre y precio.
- Coloca
NULLen descripción. - Consulta nuevamente.
- Explica por qué el código no fue modificado.
Eliminar datos con DELETE
1 Anatomía de una eliminación
DELETE FROM productos
WHERE id = 8;Elimina la fila cuyo identificador es 8.
2 El peligro de omitir WHERE
DELETE FROM productos;La instrucción elimina todas las filas de la tabla. La estructura permanece, pero los datos desaparecen.
No la ejecutes sobre el proyecto.
3 Procedimiento seguro de eliminación
Paso 1. Justifica la eliminación
No elimines un registro solamente porque “ya no se usa”. Puede existir un historial relacionado.
Paso 2. Consulta la fila
SELECT id, codigo, nombre
FROM productos
WHERE id = 8;Paso 3. Comprueba relaciones
Si existen movimientos del producto, la clave foránea puede impedir la eliminación.
Paso 4. Ejecuta dentro de una transacción
Primero prueba el efecto con ROLLBACK.
Paso 5. Verifica ausencia y estado de las relaciones
SELECT id, codigo, nombre
FROM productos
WHERE id = 8;4 DELETE no es DROP TABLE
| Instrucción | Elimina | Conserva |
|---|---|---|
DELETE FROM productos WHERE id = 8 | Una o varias filas | Tabla y demás filas |
DELETE FROM productos | Todas las filas | Tabla vacía |
DROP TABLE productos | Tabla y sus filas | Nada de esa estructura |
DROP TABLE modifica el esquema. DELETE modifica los datos.
5 Eliminación lógica
Algunos sistemas no borran físicamente un producto. Cambian su estado:
UPDATE productos
SET activo = 0
WHERE id = 8;Esto se conoce como eliminación lógica o desactivación. Permite conservar historial.
No siempre es la solución correcta. Si la información no necesita conservarse y no tiene dependencias, una eliminación física puede ser válida.
6 Las claves foráneas pueden impedir eliminaciones
Si un producto tiene movimientos y la relación utiliza ON DELETE RESTRICT, SQLite rechazará la eliminación.
Ese error protege el historial.
No desactives las claves foráneas para forzar el borrado. Decide si corresponde:
- Conservar y desactivar el producto.
- Eliminar primero datos dependientes autorizados.
- Cambiar la regla del modelo mediante una migración planificada.
Práctica guiada 3 — Eliminar o desactivar
Para cada caso, decide entre eliminación física, desactivación o conservación obligatoria:
- Producto de prueba creado por error y sin movimientos.
- Producto real retirado de venta con historial de movimientos.
- Categoría sin productos creada con un nombre equivocado.
- Paciente con citas históricas.
- Registro duplicado que nunca fue referenciado.
Justifica cada respuesta antes de escribir SQL.
Transacciones: todo o nada
1 El problema de las operaciones parciales
Una salida de inventario necesita:
- Reducir el stock.
- Registrar el movimiento.
Supón que la primera instrucción funciona y la segunda falla:
Stock reducido ✓
Movimiento registrado ✗El inventario queda sin explicación. La operación está incompleta.
Una transacción agrupa instrucciones para tratarlas como una unidad.
BEGIN
instrucción 1
instrucción 2
verificación
COMMIT → conservar todo
o
ROLLBACK → deshacer todo2 Analogía: una transferencia bancaria
Transferir dinero implica restar de una cuenta y sumar en otra. No sería aceptable conservar solamente una mitad.
Cuenta A: -100
Cuenta B: +100Ambos cambios deben confirmarse juntos o deshacerse juntos.
3 BEGIN
BEGIN TRANSACTION;Inicia una transacción explícita.
4 COMMIT
COMMIT;Confirma los cambios realizados desde BEGIN.
5 ROLLBACK
ROLLBACK;Deshace los cambios no confirmados de la transacción.
6 Primera prueba con ROLLBACK
Estado inicial:
SELECT id, nombre, stock
FROM productos
WHERE id = 2;Transacción de prueba:
BEGIN TRANSACTION;
UPDATE productos
SET stock = stock - 3
WHERE id = 2;
SELECT id, nombre, stock
FROM productos
WHERE id = 2;
ROLLBACK;Consulta final:
SELECT id, nombre, stock
FROM productos
WHERE id = 2;Durante la transacción observarás el valor reducido. Después de ROLLBACK, el stock regresará al valor inicial.
7 Operación confirmada
BEGIN TRANSACTION;
UPDATE productos
SET stock = stock + 5
WHERE id = 2;
SELECT id, nombre, stock
FROM productos
WHERE id = 2;
COMMIT;Después de COMMIT, el nuevo valor permanece.
8 Varias instrucciones en una transacción
Primero crea la tabla de movimientos en una base de práctica:
CREATE TABLE movimientos (
id INTEGER PRIMARY KEY,
producto_id INTEGER NOT NULL,
tipo TEXT NOT NULL
CHECK (tipo IN ('ENTRADA', 'SALIDA', 'AJUSTE')),
cantidad INTEGER NOT NULL CHECK (cantidad > 0),
stock_anterior INTEGER NOT NULL CHECK (stock_anterior >= 0),
stock_nuevo INTEGER NOT NULL CHECK (stock_nuevo >= 0),
fecha TEXT NOT NULL,
motivo TEXT NOT NULL,
FOREIGN KEY (producto_id)
REFERENCES productos(id)
ON DELETE RESTRICT
);Salida de tres unidades del producto 2, cuyo stock inicial es 12:
BEGIN TRANSACTION;
UPDATE productos
SET stock = stock - 3
WHERE id = 2;
INSERT INTO movimientos (
id,
producto_id,
tipo,
cantidad,
stock_anterior,
stock_nuevo,
fecha,
motivo
) VALUES (
1,
2,
'SALIDA',
3,
12,
9,
'2026-08-02 10:30',
'Entrega de pedido interno'
);
SELECT id, nombre, stock
FROM productos
WHERE id = 2;
SELECT *
FROM movimientos
WHERE id = 1;
COMMIT;Las dos instrucciones se conservan juntas.
9 Qué hacer si algo falla
- No ejecutes
COMMIT. - Lee el mensaje de error.
- Ejecuta
ROLLBACKsi la transacción continúa abierta. - Consulta el estado final.
- Corrige la causa.
- Inicia una transacción nueva.
No intentes continuar agregando instrucciones al azar.
10 Una transacción no reemplaza las restricciones
Las restricciones y las transacciones cumplen funciones diferentes:
| Herramienta | Protege |
|---|---|
| Restricción | Validez de cada estado o relación |
| Transacción | Unidad completa de varias operaciones |
Necesitas ambas.
11 Propiedades ACID a nivel inicial
Atomicidad
La operación se completa entera o no se conserva.
Consistencia
Las reglas de integridad deben seguir cumpliéndose.
Aislamiento
Las operaciones simultáneas no deberían mezclarse de forma incorrecta. El estudio detallado de concurrencia queda fuera de este módulo.
Durabilidad
Después de confirmar, los cambios deben permanecer incluso si el programa termina.
12 Transacciones y DB Browser
DB Browser puede mantener cambios pendientes mediante sus botones Write Changes y Revert Changes. Cuando utilices BEGIN, COMMIT y ROLLBACK explícitos:
- Guarda o revierte cualquier cambio pendiente antes de comenzar.
- Ejecuta el bloque desde
BEGINhastaCOMMIToROLLBACK. - No ejecutes un segundo
BEGINdentro de una transacción abierta. - Si aparece “cannot start a transaction within a transaction”, termina o revierte la transacción pendiente y vuelve a empezar.
- Cierra siempre una transacción con
COMMIToROLLBACK.
Video recomendado
Transacciones en SQL: concurrencia, `COMMIT` y `ROLLBACK`
Propósito: reforzar por qué una transacción agrupa cambios y cómo se confirman o revierten.
Práctica guiada 4 — Confirmar y revertir
- Consulta el stock del producto 4.
- Inicia una transacción.
- Suma diez unidades.
- Consulta el valor dentro de la transacción.
- Ejecuta
ROLLBACK. - Comprueba que el valor original regresó.
- Repite la operación.
- Esta vez utiliza
COMMIT. - Comprueba que el nuevo valor permaneció.
- Explica la diferencia mediante una frase.
Práctica guiada 5 — Recuperar una operación inválida
- Selecciona un producto con stock menor que 20.
- Inicia una transacción.
- Intenta restar 20 unidades.
- Observa la respuesta de
CHECK (stock >= 0). - Ejecuta
ROLLBACK. - Comprueba que el stock original permanece.
- Corrige la cantidad y repite en una transacción nueva.
- Confirma solamente si el resultado es válido.
Método COA para cambios seguros
Utiliza esta secuencia en cada modificación manual:
1. IDENTIFICAR
Base, tabla y objetivo.
2. RESPALDAR
Trabajar con una copia si el riesgo lo justifica.
3. CONSULTAR
Mostrar las filas objetivo mediante SELECT.
4. PREDECIR
Escribir el estado esperado.
5. INICIAR
BEGIN TRANSACTION.
6. MODIFICAR
UPDATE, DELETE o varias instrucciones.
7. VERIFICAR
Consultar dentro de la transacción.
8. DECIDIR
COMMIT si es correcto; ROLLBACK si no lo es.
9. COMPROBAR
Consultar nuevamente y revisar integridad.
10. DOCUMENTAR
Registrar el propósito y resultado.1 Respaldo de una base SQLite
Para una práctica local sencilla:
- Asegúrate de que no existan cambios pendientes.
- Cierra DB Browser.
- Copia el archivo
.db. - Nombra la copia con propósito y fecha.
Ejemplo:
inventario_antes_ajuste_2026-08-02.dbUna copia no sustituye una estrategia profesional de respaldo, pero permite recuperar una práctica local.
2 Script reproducible
Organiza el proyecto:
1. Configuración
2. Creación de tablas
3. Datos iniciales
4. Operaciones CRUD demostrativas
5. Transacciones confirmadas
6. Transacciones de prueba revertidas
7. Consultas de comprobación
8. Pruebas inválidas comentadasLas transacciones demostrativas deben partir de un estado conocido para que sus resultados puedan explicarse.
3 Datos de prueba frente a datos reales
Utiliza datos inventados. No practiques eliminaciones o modificaciones sobre información personal o sobre una base compartida.
Buenas prácticas y errores frecuentes
1 Ejecutar UPDATE o DELETE sin consultar primero
La condición puede ser sintácticamente correcta y seleccionar una fila equivocada.
2 Omitir WHERE
Sin WHERE, todas las filas pueden cambiar o desaparecer.
3 Utilizar un nombre cuando existe un identificador
Dos productos podrían compartir una descripción similar. Para cambios exactos, utiliza una clave única comprobada.
4 Confirmar antes de verificar
Después de COMMIT, ROLLBACK ya no deshace esa transacción. Verifica primero.
5 Dejar una transacción abierta
Puede bloquear escrituras o generar confusión sobre qué cambios están pendientes.
6 Confiar solamente en el mensaje “sin errores”
Una instrucción puede afectar cero filas y no producir error. Consulta el resultado.
7 Desactivar claves foráneas
Evitar el error no corrige la relación. Mantén:
PRAGMA foreign_keys = ON;8 Borrar historial cuando bastaba desactivar
Analiza si el registro debe conservarse para explicar operaciones pasadas.
9 Registrar un movimiento sin actualizar el saldo
El historial y el estado actual quedarían en desacuerdo. Agrupa ambos cambios en una transacción.
10 Modificar el archivo .db desde un editor de texto
Utiliza SQLite o una herramienta compatible. El archivo no es un documento SQL legible.
Ejercicios individuales
Intenta resolverlos antes de consultar las soluciones.
Ejercicio 1 — Clasificar CRUD
Clasifica cada necesidad como crear, leer, actualizar o eliminar:
- Registrar un paciente nuevo.
- Mostrar el teléfono de un paciente.
- Corregir un correo.
- Retirar un registro de prueba sin historial.
- Consultar un producto antes de cambiar su precio.
- Desactivar un empleado.
Indica la instrucción SQL principal que utilizarías.
Ejercicio 2 — Completar una inserción
Tabla:
CREATE TABLE proveedores (
id INTEGER PRIMARY KEY,
codigo TEXT NOT NULL UNIQUE,
nombre TEXT NOT NULL,
telefono TEXT,
activo INTEGER NOT NULL DEFAULT 1 CHECK (activo IN (0, 1))
);Escribe una inserción para el proveedor 1, código PRO-001, nombre Suministros Delta, teléfono desconocido y estado activo predeterminado. Omite las columnas que deban recibir su valor automáticamente.
Ejercicio 3 — Detectar el error de integridad
Indica qué restricción fallará:
- Repetir
PRO-001. - Insertar un proveedor sin nombre.
- Utilizar activo igual a 3.
- Insertar
NULLcomo código.
Ejercicio 4 — Reparar una actualización peligrosa
Se desea cambiar únicamente el teléfono del proveedor 4:
UPDATE proveedores
SET telefono = '2222-4455';Escribe el procedimiento completo: consulta previa, actualización segura y consulta posterior.
Ejercicio 5 — Actualizar varias columnas
El producto 3 debe cambiar su precio a 8.75, su descripción a Soporte reforzado y su estado a activo. Escribe una sola instrucción dirigida por identificador.
Ejercicio 6 — Predecir el resultado
El producto 2 posee stock 12. Predice el valor después de cada instrucción si se ejecutan consecutivamente:
UPDATE productos SET stock = stock + 8 WHERE id = 2;
UPDATE productos SET stock = stock - 5 WHERE id = 2;
UPDATE productos SET stock = stock + 2 WHERE id = 999;Explica por qué la última instrucción no produce necesariamente un error.
Ejercicio 7 — Eliminar o desactivar
Decide y justifica:
- Producto vendido durante años que ya no se ofrece.
- Producto de prueba sin movimientos.
- Movimiento de inventario confirmado.
- Categoría vacía creada por error.
- Paciente con citas históricas.
Ejercicio 8 — Reparar una eliminación
Se quiere eliminar el producto con código TMP-009:
DELETE FROM productos;Escribe el procedimiento seguro utilizando primero una consulta y después una eliminación dirigida por una clave única.
Ejercicio 9 — Elegir COMMIT o ROLLBACK
Decide:
- La actualización produjo exactamente el resultado esperado.
- Se modificó la fila equivocada.
- Una de dos instrucciones relacionadas falló.
- El resultado es correcto, pero todavía no se verificaron las relaciones.
- La operación era solamente una prueba.
Ejercicio 10 — Ordenar una transacción
Ordena:
COMMIT
SELECT de verificación
BEGIN TRANSACTION
UPDATE
SELECT previoAñade dónde utilizarías ROLLBACK si la verificación falla.
Ejercicio 11 — Corregir una operación parcial
Una salida de inventario redujo el stock, pero no registró el movimiento. Explica:
- Qué inconsistencia aparece.
- Qué dos instrucciones debieron agruparse.
- Qué habría ocurrido si el error aparecía antes de
COMMIT. - Qué debes hacer si el cambio ya fue confirmado y no existe transacción abierta.
Ejercicio 12 — Diseñar una prueba de recuperación
Escribe un bloque que:
- Consulte el stock del producto 1.
- Inicie una transacción.
- Sume 100 unidades.
- Muestre el valor temporal.
- Revierta el cambio.
- Muestre el valor final.
Soluciones de los ejercicios — consultar después de intentarlos
Soluciones explicadas de los ejercicios
Solución del ejercicio 1
| Necesidad | CRUD | SQL principal |
|---|---|---|
| Registrar paciente | Create | INSERT |
| Mostrar teléfono | Read | SELECT |
| Corregir correo | Update | UPDATE |
| Retirar prueba | Delete | DELETE |
| Consultar antes de cambiar | Read | SELECT |
| Desactivar empleado | Update | UPDATE |
Desactivar no elimina físicamente; actualiza un estado.
Solución del ejercicio 2
INSERT INTO proveedores (
id,
codigo,
nombre,
telefono
) VALUES (
1,
'PRO-001',
'Suministros Delta',
NULL
);activo se omite y recibe 1.
Solución del ejercicio 3
UNIQUE.NOT NULL.CHECK.NOT NULL.
Solución del ejercicio 4
SELECT id, codigo, nombre, telefono
FROM proveedores
WHERE id = 4;
UPDATE proveedores
SET telefono = '2222-4455'
WHERE id = 4;
SELECT id, codigo, nombre, telefono
FROM proveedores
WHERE id = 4;Solución del ejercicio 5
UPDATE productos
SET
precio = 8.75,
descripcion = 'Soporte reforzado',
activo = 1
WHERE id = 3;Solución del ejercicio 6
Inicial: 12
Después de +8: 20
Después de -5: 15
Después de actualizar id 999: 15La última condición no encuentra filas. Afectar cero filas no es necesariamente un error de SQL.
Solución orientativa del ejercicio 7
- Desactivar para conservar historial.
- Eliminar físicamente si se comprobó que no tiene dependencias.
- Conservar; explica el historial.
- Eliminar físicamente si no tiene dependencias.
- Conservar; forma parte del historial clínico.
Solución del ejercicio 8
SELECT id, codigo, nombre
FROM productos
WHERE codigo = 'TMP-009';
DELETE FROM productos
WHERE codigo = 'TMP-009';
SELECT id, codigo, nombre
FROM productos
WHERE codigo = 'TMP-009';La eliminación debería probarse primero dentro de una transacción.
Solución del ejercicio 9
COMMIT, después de verificar todo.ROLLBACK.ROLLBACK.- Todavía no confirmar; verificar y decidir.
ROLLBACK.
Solución del ejercicio 10
1. SELECT previo
2. BEGIN TRANSACTION
3. UPDATE
4. SELECT de verificación
5. COMMIT si es correcto
o ROLLBACK si fallaSolución del ejercicio 11
- El stock cambia sin una explicación en el historial.
- El
UPDATEdel producto y elINSERTdel movimiento. ROLLBACKhabría deshecho los cambios pendientes.- Un cambio confirmado no se revierte mediante
ROLLBACK; se necesita una nueva operación correctiva autorizada y documentada.
Solución del ejercicio 12
SELECT id, nombre, stock
FROM productos
WHERE id = 1;
BEGIN TRANSACTION;
UPDATE productos
SET stock = stock + 100
WHERE id = 1;
SELECT id, nombre, stock
FROM productos
WHERE id = 1;
ROLLBACK;
SELECT id, nombre, stock
FROM productos
WHERE id = 1;Mini proyecto — Caja diaria de una cafetería
Objetivo
Practicar inserciones, correcciones, anulaciones lógicas y transacciones mediante operaciones pequeñas y verificables.
Situación
Una cafetería registra ventas y sus líneas de detalle. Cada venta posee un estado. Una venta confirmada no debe quedar sin detalles y un detalle no puede existir sin su venta.
Tablas mínimas
productos_cafeteria
ventas
detalle_ventaReglas
- Los códigos de producto son únicos.
- Precio y cantidad deben ser positivos.
- Una venta comienza con estado
ABIERTA. - Estados permitidos:
ABIERTA,PAGADA,ANULADA. - Cada detalle pertenece a una venta y un producto existentes.
- La combinación de venta y producto no puede repetirse en esta versión sencilla.
- Las ventas con detalles no se eliminan físicamente; se anulan mediante
UPDATE.
Actividades obligatorias
- Crea tres productos.
- Crea una venta abierta.
- Dentro de una transacción, inserta dos detalles y cambia la venta a
PAGADA. - Verifica y utiliza
COMMIT. - Inicia otra transacción para una venta de prueba.
- Inserta un detalle con cantidad incorrecta o producto equivocado.
- Verifica el problema y utiliza
ROLLBACK. - Corrige el teléfono o una observación opcional mediante
UPDATEdirigido. - Anula lógicamente una venta mediante su identificador.
- Intenta eliminar una venta con detalles y observa la protección referencial.
Evidencias internas
- Estado anterior y posterior de la venta confirmada.
- Detalles conservados después de
COMMIT. - Ausencia de la venta de prueba después de
ROLLBACK. - Mensaje de una restricción rechazando una operación inválida.
Lista de comprobación
- Las claves foráneas están activas.
- Las inserciones utilizan columnas explícitas.
- Cada
UPDATEyDELETEcontieneWHERE. - Existe una transacción confirmada.
- Existe una transacción revertida.
- Las consultas de verificación aparecen antes de confirmar.
- No se eliminó historial válido.
El mini proyecto es obligatorio, pero se conserva dentro de la evidencia del módulo y no necesita un punto de entrega independiente.
Proyecto del módulo — Sistema de inventario y movimientos
Desafío
Una empresa necesita conocer la existencia actual de cada producto y conservar la explicación de cada cambio. Actualmente las cantidades se modifican manualmente y no existe un historial confiable.
Construirás una base que permita:
- Registrar categorías y productos.
- Corregir información.
- Desactivar productos.
- Registrar entradas, salidas y ajustes.
- Proteger la existencia contra valores negativos.
- Mantener juntos el cambio de stock y su movimiento.
- Probar una operación y revertirla.
Tablas obligatorias
categorias
id.nombreobligatorio y único.descripcionopcional.
productos
id.codigoobligatorio y único.nombreobligatorio.preciopositivo.stockno negativo y con valor inicial 0.activolimitado a 0 y 1, con valor inicial 1.descripcionopcional.categoria_idobligatorio y válido.
movimientos
id.producto_idobligatorio y válido.tipolimitado aENTRADA,SALIDAyAJUSTE.cantidadpositiva.stock_anteriorno negativo.stock_nuevono negativo.fechaobligatoria.motivoobligatorio.referenciaopcional.
Reglas de integridad
- Una categoría con productos no puede eliminarse.
- Un producto con movimientos no puede eliminarse.
- Un producto retirado se desactiva con
activo = 0. - El stock nunca puede ser negativo.
- Cada movimiento pertenece a un producto existente.
- La cantidad del movimiento debe ser mayor que cero.
- El tipo debe pertenecer al conjunto permitido.
- El cambio de stock y el registro del movimiento se confirman o revierten juntos.
- El estado final del producto debe coincidir con
stock_nuevo.
Datos iniciales mínimos
- Cuatro categorías.
- Doce productos.
- Por lo menos dos productos con stock inicial cero.
- Precios y existencias variadas.
- Por lo menos tres descripciones
NULLlegítimas.
Operaciones CRUD obligatorias
Inserciones
- Inserción múltiple de categorías.
- Inserción múltiple de productos.
- Inserción de por lo menos seis movimientos válidos.
Actualizaciones
- Corregir nombre y descripción de un producto.
- Corregir el precio de otro producto.
- Desactivar un producto con historial.
- Actualizar stock dentro de cada movimiento transaccional.
Eliminaciones
- Crear y eliminar un producto temporal sin movimientos.
- Intentar eliminar un producto con movimientos y demostrar que se rechaza.
- Intentar eliminar una categoría utilizada y demostrar que se rechaza.
Cada actualización y eliminación debe incluir consulta previa, WHERE y consulta posterior.
Transacciones obligatorias
Transacción 1 — Entrada confirmada
- Consulta el stock inicial.
- Inicia la transacción.
- Aumenta el stock.
- Inserta el movimiento
ENTRADA. - Comprueba producto y movimiento.
- Ejecuta
COMMIT. - Comprueba que los cambios permanecen.
Transacción 2 — Salida confirmada
- Consulta el stock inicial.
- Verifica que existen unidades suficientes.
- Inicia la transacción.
- Reduce el stock.
- Inserta el movimiento
SALIDA. - Comprueba el resultado.
- Ejecuta
COMMIT.
Transacción 3 — Ajuste revertido
- Consulta el stock inicial.
- Inicia la transacción.
- Aplica un ajuste de prueba.
- Inserta un movimiento temporal.
- Muestra el estado provisional.
- Ejecuta
ROLLBACK. - Demuestra que producto y movimiento regresaron al estado inicial.
Transacción 4 — Error recuperado
- Inicia una salida que produciría stock negativo o un movimiento inválido.
- Observa el error de restricción.
- Ejecuta
ROLLBACKsi la transacción continúa abierta. - Comprueba que no quedó un cambio parcial.
- Corrige la cantidad y repite en una transacción nueva.
Pruebas inválidas obligatorias
Demuestra que se rechaza:
- Código de producto duplicado.
- Precio igual o menor que cero.
- Stock negativo.
- Producto con categoría inexistente.
- Movimiento con producto inexistente.
- Tipo de movimiento no permitido.
- Cantidad igual a cero.
- Eliminación de producto con historial.
Las pruebas inválidas deben quedar comentadas al final del script para no impedir su ejecución completa.
Orden recomendado del script
1. Encabezado
2. PRAGMA foreign_keys = ON
3. Creación de tablas
4. Inserción de datos iniciales
5. Consultas de comprobación
6. Actualizaciones seguras
7. Eliminación segura del registro temporal
8. Transacciones confirmadas
9. Transacción revertida
10. Recuperación de error
11. Verificación final
12. Pruebas inválidas comentadasProceso de construcción
Fase 1. Define los estados iniciales
Escribe los productos y cantidades antes de aplicar movimientos.
Fase 2. Diseña y crea las tablas
Aplica las relaciones y restricciones del Módulo 2.
Fase 3. Inserta datos en orden
Primero categorías, después productos y finalmente movimientos.
Fase 4. Comprueba los valores predeterminados
Verifica stock y activo cuando se omiten.
Fase 5. Ejecuta correcciones
Utiliza el procedimiento consultar–actualizar–consultar.
Fase 6. Prueba eliminaciones con ROLLBACK
No confirmes hasta comprobar el efecto.
Fase 7. Implementa cada transacción
Ejecuta una operación a la vez. Conserva evidencia antes, durante y después.
Fase 8. Reconstruye desde cero
El script debe producir siempre el mismo estado final cuando se ejecuta una vez sobre una base vacía.
Fase 9. Documenta
Explica el objetivo de cada operación y por qué se confirmó o revirtió.
Restricciones del proyecto
- No utilices Python ni otro lenguaje.
- No utilices
JOIN, agrupaciones ni consultas analíticas. - No ejecutes
UPDATEoDELETEsinWHERE. - No desactives claves foráneas.
- No elimines movimientos confirmados.
- No sustituyas la desactivación por borrado cuando exista historial.
- No confirmes una transacción antes de comprobarla.
- No dejes transacciones abiertas.
- No utilices datos reales de una empresa.
Lista de comprobación
- Las tres tablas se crean correctamente.
- Las claves foráneas están activas.
- Las restricciones protegen precios, stock, tipos y cantidades.
- Existen cuatro categorías y doce productos.
- Se comprobaron los valores predeterminados.
- Las inserciones declaran columnas.
- Todas las actualizaciones tienen consulta previa y posterior.
- Todas las eliminaciones contienen
WHERE. - El producto con historial se desactiva.
- Existen dos transacciones confirmadas.
- Existe un ajuste revertido.
- Existe un error recuperado sin cambios parciales.
- Existen al menos seis movimientos válidos.
- Las ocho pruebas inválidas son rechazadas.
PRAGMA foreign_key_checkno devuelve filas.- El script reconstruye la base desde cero.
- La documentación explica cada decisión.
Condición de avance
El proyecto debe alcanzar al menos 70 puntos, cumplir los requisitos críticos y ser aprobado. Si recibe observaciones, deberás corregirlo antes de comenzar el Módulo 4.
Rúbrica de evaluación del proyecto
| Criterio | Evidencia esperada | Puntos |
|---|---|---|
| Funcionamiento e integridad | Tablas, datos y restricciones funcionan sin referencias inválidas | 20 |
| Inserciones | Datos suficientes, columnas explícitas, orden correcto y uso coherente de valores predeterminados | 15 |
| Actualizaciones y eliminaciones | Cambios dirigidos, comprobados y coherentes con el historial | 20 |
| Transacciones | Operaciones agrupadas correctamente, dos confirmadas, una revertida y un error recuperado | 25 |
| Organización del SQL | Script reproducible, comentado, ordenado y sin transacciones abiertas | 10 |
| Documentación y evidencias | Explicaciones claras y capturas antes, durante y después | 10 |
| Total | 100 |
Requisitos críticos
El proyecto no puede aprobarse si:
- No se entrega el script SQL.
- El script no funciona sobre una base vacía.
- Existe un
UPDATEoDELETEsinWHEREdentro de las operaciones del proyecto. - Las claves foráneas están desactivadas.
- El stock puede quedar negativo.
- El cambio de stock y su movimiento no se agrupan en una transacción.
- No se demuestra
COMMITyROLLBACK. - Queda una transacción abierta.
- Se elimina historial válido para evitar un error.
- No se incluyen las pruebas y evidencias obligatorias.
- Se utiliza contenido copiado sin comprensión demostrable.
Evaluación práctica del módulo
Situación
Una base de datos de inventario contiene estos incidentes:
- El precio del producto 4 es incorrecto.
- Un producto retirado conserva historial y debe desactivarse.
- Deben ingresar siete unidades del producto 2 y registrarse el movimiento.
- Se solicitó probar una salida de cien unidades sin conservarla.
Tareas
- Consulta el producto 4 antes del cambio.
- Actualiza únicamente su precio.
- Comprueba el resultado.
- Consulta y desactiva el producto retirado mediante
UPDATE. - Construye una transacción para la entrada de siete unidades.
- Registra el movimiento correspondiente.
- Comprueba y confirma la entrada.
- Construye otra transacción para la salida de cien unidades.
- Comprueba el error o resultado inválido.
- Revierte la operación.
- Demuestra que el stock y los movimientos quedaron correctos.
Tiempo sugerido
15 minutos
Criterios de dominio
- Cada fila objetivo se consulta antes de modificarse.
- Cada
UPDATEutilizaWHERE. - La entrada y su movimiento se confirman juntos.
- La prueba peligrosa se revierte.
- No queda un cambio parcial.
- El estudiante puede explicar por qué eligió
COMMIToROLLBACK.
Punto de entrega obligatorio
Todo el módulo se entrega mediante un único punto. Los ejercicios, el mini proyecto y las capturas no requieren formularios separados.
Nombre del archivo
COA_SQL_M03_Apellido_Nombre.zipEjemplo:
COA_SQL_M03_Cerna_Victor.zipContenido obligatorio
COA_SQL_M03_Apellido_Nombre/
├── COA_SQL_M03_Apellido_Nombre.sql
├── inventario.db
├── explicacion_operaciones.pdf
└── evidencias/
├── 01_datos_iniciales.png
├── 02_actualizacion_segura.png
├── 03_eliminacion_temporal.png
├── 04_entrada_antes.png
├── 05_entrada_durante.png
├── 06_entrada_confirmada.png
├── 07_ajuste_durante.png
├── 08_ajuste_revertido.png
├── 09_error_recuperado.png
├── 10_restriccion_rechazada.png
├── 11_foreign_key_check.png
└── 12_prueba_script_vacio.pngContenido de explicacion_operaciones.pdf
- Descripción del inventario.
- Reglas de integridad.
- Estado inicial de los productos utilizados.
- Explicación de cada actualización.
- Justificación de cada eliminación o desactivación.
- Explicación paso a paso de las cuatro transacciones.
- Razón para utilizar
COMMIToROLLBACK. - Resultado de las pruebas inválidas.
- Confirmación de que no quedaron cambios parciales.
Toda la explicación se reúne en un único PDF.
Evidencias
- Las capturas de una transacción deben mostrar estado anterior, provisional y final.
- La evidencia de
ROLLBACKdebe demostrar que el cambio temporal desapareció. - La evidencia de error debe mostrar que no quedó una actualización parcial.
PRAGMA foreign_key_checkdebe ejecutarse sobre la versión final.- La prueba del script debe utilizar una base vacía.
Antes de enviar
- Abre el archivo comprimido.
- Comprueba los nombres.
- Ejecuta el script sobre una base vacía.
- Confirma que no exista una transacción abierta.
- Revisa el stock final y los movimientos.
- Comprueba que las pruebas inválidas estén comentadas.
- Ejecuta
PRAGMA foreign_key_check. - Confirma que todas las capturas correspondan a la versión final.
Entrega del Módulo 3
Último paso del móduloCuando hayas completado las actividades, el proyecto, las pruebas y la reflexión, reúne todo en un único archivo comprimido.
La entrega única debe incluir:
- El script SQL principal
- La base de datos inventario.db
- La explicación de las operaciones en PDF
- Las doce evidencias solicitadas
Ejemplo de nombre: COA_SQL_M03_Cerna_Victor.zip
Antes de enviar, verifica que el archivo tenga el nombre solicitado.
Retos adicionales
Reto 1 — Corrección múltiple controlada
Crea tres productos de prueba con una descripción incorrecta. Diseña una actualización para cada uno y explica por qué no utilizaste una instrucción general sin identificar las filas.
Reto 2 — Desactivación reversible
Desactiva un producto dentro de una transacción, comprueba el resultado y utiliza ROLLBACK. Después repite y confirma. Compara ambos estados.
Reto 3 — Movimiento incompleto
Simula una transacción en la que el UPDATE funciona, pero el INSERT viola un CHECK. Demuestra que ROLLBACK conserva el stock original.
Reto 4 — Auditoría de seguridad
Revisa el script y marca cada UPDATE y DELETE. Comprueba que todos incluyan condición, consulta previa, verificación y una decisión consciente de transacción.
Videos recomendados del módulo
Video esencial 1
SQL: `INSERT`, `UPDATE` y `DELETE` — Universitat Politècnica de València
Tema exacto: operaciones para insertar, modificar y eliminar datos. Momento recomendado: después de estudiar CRUD. Objetivo: reforzar la sintaxis y el riesgo de modificar filas sin una condición adecuada.
Video esencial 2
Transacciones en SQL: concurrencia, `COMMIT` y `ROLLBACK`
Tema exacto: agrupación, confirmación y reversión de cambios. Momento recomendado: antes de construir las transacciones del proyecto. Objetivo: comprender por qué varias instrucciones deben tratarse como una unidad.
Los videos no sustituyen las pruebas. Debes observar el estado de la base antes, durante y después de cada transacción.
Documentación y recursos de lectura
Instrucciones de manipulación
- `INSERT` — documentación oficial de SQLite
- `UPDATE` — documentación oficial de SQLite
- `DELETE` — documentación oficial de SQLite
Transacciones e integridad
- Transacciones — documentación oficial de SQLite
- Claves foráneas — documentación oficial de SQLite
- Restricciones de `CREATE TABLE` — documentación oficial de SQLite
La documentación muestra variantes más avanzadas que no son necesarias en este módulo. Concéntrate en:
INSERT ... VALUES.UPDATE ... SET ... WHERE.DELETE FROM ... WHERE.BEGIN,COMMITyROLLBACK.
Glosario
| Término | Significado |
|---|---|
| ACID | Conjunto de propiedades de las transacciones |
| Atomicidad | Una operación se conserva completa o se deshace completa |
| Cambio parcial | Estado en el que solo se ejecutó una parte de una operación |
COMMIT | Confirma los cambios de una transacción |
| Consistencia | Conservación de las reglas de integridad |
| Create de CRUD | Creación de un registro mediante INSERT |
| CRUD | Crear, leer, actualizar y eliminar datos |
| Delete de CRUD | Eliminación de registros mediante DELETE |
| Desactivación | Cambio de estado que conserva el registro |
| Durabilidad | Permanencia de los cambios confirmados |
| Eliminación física | Borrado real de una fila |
| Eliminación lógica | Conservación del registro con un estado inactivo |
INSERT | Instrucción para añadir filas |
| Integridad | Condición de datos válidos y relaciones coherentes |
BEGIN | Inicia una transacción explícita |
ROLLBACK | Deshace cambios no confirmados |
| Read de CRUD | Lectura de datos mediante SELECT |
| Transacción | Grupo de operaciones tratado como una unidad |
UPDATE | Instrucción para modificar filas |
| Update de CRUD | Modificación de datos mediante UPDATE |
WHERE | Condición que determina qué filas cumplen una operación |
Resumen del módulo
CRUD representa las operaciones fundamentales sobre los datos:
Create → INSERT
Read → SELECT
Update → UPDATE
Delete → DELETEUna actualización o eliminación segura utiliza una condición y se verifica:
SELECT previo
↓
BEGIN TRANSACTION
↓
UPDATE o DELETE
↓
SELECT de verificación
↓
COMMIT o ROLLBACKCOMMIT conserva los cambios. ROLLBACK recupera el estado anterior mientras la transacción no haya sido confirmada.
Las transacciones evitan operaciones parciales, pero no reemplazan las restricciones. Una base profesional combina claves, CHECK, NOT NULL, integridad referencial y transacciones.
Habilidades obtenidas
Ahora puedes:
- Insertar datos respetando columnas, tipos y relaciones.
- Interpretar errores de integridad.
- Corregir registros mediante actualizaciones dirigidas.
- Eliminar filas específicas mediante un procedimiento seguro.
- Decidir cuándo conservar historial mediante desactivación.
- Actualizar valores a partir de su estado actual.
- Crear y verificar transacciones.
- Confirmar operaciones válidas.
- Revertir pruebas o cambios incorrectos.
- Proteger operaciones compuestas contra estados parciales.
- Documentar el estado anterior y posterior de una modificación.
Antes de continuar
Comprueba que puedes explicar y demostrar:
- La diferencia entre
CREATE TABLEy Create dentro de CRUD. - Por qué las inserciones deben declarar columnas.
- Qué ocurre si un
UPDATEno contieneWHERE. - Qué diferencia existe entre
DELETEyDROP TABLE. - Cuándo conviene desactivar en lugar de eliminar.
- Por qué debes consultar antes y después de modificar.
- Qué diferencia existe entre una restricción y una transacción.
- Cuándo utilizar
COMMIT. - Cuándo utilizar
ROLLBACK. - Por qué un cambio confirmado no se deshace con un
ROLLBACKposterior. - Cómo impedir que el stock cambie sin registrar el movimiento.
No continúes con el Módulo 4 hasta que el proyecto de inventario haya sido aprobado. El siguiente módulo se concentrará en convertir preguntas reales en consultas, filtros, expresiones, funciones y resúmenes de información.