El UPDATE que cambió todos los precios
Un empleado quiere subir 10 céntimos el precio de un bocadillo. Escribe UPDATE, se olvida de una palabra y todos los productos de la cantina suben 10 céntimos.
SQL no pregunta si estás seguro. Esta lección enseña a añadir, cambiar y borrar datos con cuidado, y a poder deshacer un error antes de que sea definitivo.
Al terminar esta lección
Nota
Puedo añadir, cambiar y borrar datos con INSERT, UPDATE y DELETE sin perder los que no quería tocar.
Palabras clave
| Palabra | Qué significa |
|---|---|
| INSERT | añade un registro nuevo a una tabla |
| UPDATE | cambia los valores de registros que ya existen |
| DELETE | borra registros de una tabla |
| Transacción | un grupo de cambios que se guardan todos o ninguno |
| COMMIT | guarda los cambios de una transacción |
| ROLLBACK | deshace los cambios de una transacción |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
INSERT añade un registro nuevo
INSERT INTO nombra la tabla y los campos. VALUES da los valores, en el mismo orden. El texto va entre comillas simples.
Para practicar sin riesgo, harás una copia de la tabla de productos en tu base student_library. Lo que cambies ahí no afecta a la tienda.
Preparar el terminal
Nota
Con el laboratorio iniciado, ejecuta las líneas siguientes en orden. Crean tu base si falta y una copia de los productos. Los Run empiezan por borrar la copia, así que puedes repetirlos.
Aceptar el certificado del servidor
printf '[client]\nssl-verify-server-cert=0\n' > ~/.my.cnfSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Crear tu base si falta
mariadb -h db -u student -pstudent -e "CREATE DATABASE IF NOT EXISTS student_library"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un nombre corto para ella
alias lib='mariadb -h db -u student -pstudent student_library -t -e'Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Empezar de cero
lib "DROP TABLE IF EXISTS stock_copy"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Copiar los productos de la tienda
lib "CREATE TABLE stock_copy AS SELECT id, name, price, stock FROM shop.products"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Añadir un producto nuevo
lib "INSERT INTO stock_copy (id, name, price, stock) VALUES (100, 'Libreta', 3.50, 20)"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Contar los registros de la copia
lib "SELECT COUNT(*) AS filas FROM stock_copy"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
UPDATE y DELETE necesitan siempre un WHERE
UPDATE cambia valores. SET dice qué campo y qué valor nuevo. DELETE FROM borra registros.
Las dos órdenes actúan sobre todos los registros que cumplan el WHERE. Sin WHERE, actúan sobre toda la tabla.
El hábito seguro tiene tres pasos: ver, cambiar, volver a ver.
Ejemplo resuelto: ver, cambiar, volver a ver
| Paso | Orden | Qué compruebas |
|---|---|---|
| 1. Ver | SELECT ... WHERE id = 1 | Qué registros va a tocar el WHERE |
| 2. Cambiar | UPDATE ... SET ... WHERE id = 1 | Que la orden termina sin error |
| 3. Volver a ver | SELECT ... WHERE id = 1 | Que el valor es el nuevo |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Ver: dos libros antes del cambio
lib "SELECT id, name, stock FROM stock_copy WHERE id IN (1, 2) ORDER BY id"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Cambiar: diez unidades más del libro 1
lib "UPDATE stock_copy SET stock = stock + 10 WHERE id = 1"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Volver a ver
lib "SELECT id, name, stock FROM stock_copy WHERE id IN (1, 2) ORDER BY id"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Pruébalo: ver, cambiar y volver a ver
-- Primero mira, después cambia, después vuelve a mirar.
SELECT item, stock FROM canteen_stock WHERE id = 4;
UPDATE canteen_stock SET stock = stock + 10 WHERE id = 4;
SELECT item, stock FROM canteen_stock WHERE id = 4;
-- Cambia el 10 por un 20 y ejecútalo otra vez.
Un error frecuente
Advertencia
Mucha gente cree que UPDATE y DELETE preguntan antes de cambiar. No preguntan. Sin WHERE, DELETE FROM stock_copy vacía la tabla entera. Escribe primero el WHERE, comprueba con un SELECT y solo entonces cambia el SELECT por la orden.
Pruébalo: borrar los agotados
-- Borra los productos agotados y cuenta los que quedan.
DELETE FROM canteen_stock WHERE stock = 0;
SELECT COUNT(*) AS quedan FROM canteen_stock;
-- Antes de borrar, ¿cuántos había con stock = 0?
Una transacción se puede deshacer
Una transacción agrupa varios cambios. Empieza con START TRANSACTION. Si todo va bien, COMMIT los guarda. Si algo sale mal, ROLLBACK los deshace y la tabla queda como estaba.
Piensa en una transferencia de dinero: o salen los euros de una cuenta y entran en otra, o no pasa nada. Nunca solo la mitad.
Un cambio terrible, deshecho con ROLLBACK
lib "START TRANSACTION; UPDATE stock_copy SET stock = 0; SELECT COUNT(*) AS agotados FROM stock_copy WHERE stock = 0; ROLLBACK; SELECT COUNT(*) AS agotados FROM stock_copy WHERE stock = 0"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Para ir más lejos: borrar el libro nuevo
En tu copia hay un producto que tú añadiste, la Libreta con el número 100. Escribe un SELECT que lo encuentre y después la orden DELETE que lo borre.
Cuenta los registros antes y después. ¿Qué número esperas? Comprueba que la tienda de verdad sigue teniendo 37 productos.