Ir al contenido
wannacode

La panadería, etapa 4: los cambios

En resumen: La etapa 4 cambia los datos de la panadería con UPDATE, DELETE y un upsert, y un pedido entregado baja las existencias dentro de una transacción.

Problema

Nada se queda quieto

La harina subió de precio. Ana pagó su pedido. El pedido de Desislava salió hacia su casa. Boris canceló el suyo. Llegó una entrega. Todo esto es cambiar filas que ya existen: UPDATE, DELETE y un insert que también puede ser un cambio.

Cada campo parte de la base completa de la etapa 2.

La idea

Primero SELECT

Los dulces suben un 10 %. Antes del UPDATE ejecutas un SELECT con el mismo WHERE y el valor nuevo como expresión. Así ves qué filas cambiarán y cómo:

SQLbase de datos vacía

Tres filas, solo los dulces. Ahora el mismo WHERE pasa al UPDATE.

Pruébalo

La subida de precios

Sube un 10 % los precios de los dulces (categoría 2), redondeados a 2 decimales.

SQLbase de datos vacía

Míralo

La cuenta vieja

El precio del cruasán ahora es 1,43 €. El pedido 1, sin embargo, conserva el precio al que compró Ivan:

SQLbase de datos vacía

Por eso en la etapa 1 order_items tiene unit_price: la cuenta de la semana pasada no cambia.

Pruébalo

Pagado

Ana pagó el pedido 6. Cambia su estado a 'paid'.

SQLbase de datos vacía

Un error de escritura no pasa, porque el CHECK de la etapa 1 vigila los estados:

SQLbase de datos vacía

Ejercicio

La entrega

Cuando se entrega el pedido, los productos salen del almacén. Para cada producto del pedido, las existencias bajan en las unidades de la línea. Eso es un UPDATE con una subconsulta que toma las unidades de cada producto.

El pedido 5 (el de Desislava) se entrega. En una transacción baja las existencias de cada producto del pedido en las unidades de la línea y cambia el estado del pedido a 'delivered'.

SQLbase de datos vacía
Más precisamente, para curiosos

SQLite desde la 3.33 y PostgreSQL tienen también UPDATE … FROM: UPDATE products SET stock = stock - i.quantity FROM order_items i WHERE i.order_id = 5 AND i.product_id = products.id;. El resultado es el mismo, y con muchas filas es más rápido.

Míralo

Más de lo que hay

Hay 10 kozunaks. Alguien intenta vender 20:

SQLbase de datos vacía

CHECK (stock >= 0) de la etapa 1 no permite vender lo que no hay.

La idea

Borrar

Un producto que está en pedidos no se puede borrar: la clave foránea de order_items lo vigila.

SQLbase de datos vacía

Un producto que ya no se vende se queda en la base. Quitarlo de la carta es otra columna (active) u otra categoría, no DELETE.

Pruébalo

El pedido cancelado

La panadería no guarda los pedidos cancelados. Borra el pedido 4 junto con sus líneas.

SQLbase de datos vacía
Más precisamente, para curiosos

Muchos sistemas no borran los pedidos en absoluto: basta con el estado 'cancelled', y el historial queda para los informes y la contabilidad. Eso se llama borrado lógico (soft delete). Aquí es DELETE para que veas CASCADE en acción.

Pruébalo

Una nueva entrega

Llegó una entrega: 20 cruasanes (el producto 4, que ya existe) y un producto nuevo, 25 botellas de boza (será el producto 9, una bebida de 1,50 €). Un mismo INSERT tiene que añadir lo nuevo y aumentar lo existente. Eso es un upsert: INSERT … ON CONFLICT (id) DO UPDATE.

Con un solo INSERT escribe la entrega: (4, 'Cruasán', 2, 1.30, 20) y (9, 'Boza', 3, 1.50, 25). Si el producto existe, sus existencias aumentan en lo entregado.

SQLbase de datos vacía

La idea

Lo que viene

Cada cambio de aquí es una consulta escrita a mano: las existencias bajan cuando alguien se acuerda. La siguiente etapa hace que la base lo haga sola y sea más rápida: un índice, una vista, un trigger y una columna nueva.

Test

Ponte a prueba

1. ¿Qué hace UPDATE products SET price = price * 1.1 sin WHERE?
2. El cruasán subió de precio. ¿Qué pasa con la cuenta del pedido 1, donde Ivan se llevó tres cruasanes?
3. Una entrega de 20 cruasanes con INSERT OR REPLACE en lugar de ON CONFLICT … DO UPDATE. ¿Qué pasa con las existencias?

Creado por Ivo Gergov como parte de la campaña de Evo Tech por una educación accesible en programación ·