Todos los precios se pusieron a cero
Un desarrollador novato quiso cambiar el precio de un producto. Se le olvidó una palabra corta.
Todos los productos de la tabla pasaron a costar 0 € y la tienda estuvo regalando el género hasta la hora de comer.
Cambiar datos es fácil. Cambiar solo los datos que querías es la habilidad.
Al terminar esta lección
Nota
Puedo añadir, cambiar y borrar filas con seguridad.
Palabras clave
| Palabra | Qué significa |
|---|---|
| INSERT | añade filas nuevas a una tabla |
| UPDATE | cambia valores de filas que ya existen |
| DELETE | quita filas de una tabla |
| Transacción | un grupo de cambios que ocurren todos o ninguno |
| Commit | hace permanentes 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.
Trabaja con una copia, nunca con la tienda
En esta lección vas a cambiar datos. La tienda debe quedar como está, así que primero haces una copia.
Estos Run entran, crean tu propia base student_depot y copian los cuatro productos de jardín en una tabla llamada shelf.
Puedes repetirlos cuando quieras para empezar de nuevo.
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.
Un nombre corto para el cliente
alias db='mariadb -h db -u student -pstudent -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.
Crear tu propia base
db "CREATE DATABASE IF NOT EXISTS student_depot"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Tirar una copia antigua
db "DROP TABLE IF EXISTS student_depot.shelf"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 jardín
db "CREATE TABLE student_depot.shelf AS SELECT id, name, price, stock FROM shop.products WHERE category_id = 3"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
INSERT añade una fila
INSERT INTO nombra la tabla y sus columnas. VALUES da un paréntesis de valores por cada fila nueva.
Da los valores en el mismo orden que las columnas. Una columna que omites toma su valor por defecto, o NULL.
Si se rompe una regla de clave, la base rechaza la fila, como en la primera lección.
Añadir unos guantes
db "INSERT INTO student_depot.shelf (id, name, price, stock) VALUES (100, 'Garden Gloves', 6.50, 25)"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
UPDATE cambia filas y WHERE elige cuáles
UPDATE nombra la tabla. SET da el valor nuevo. WHERE elige las filas.
Sin WHERE, cambian todas las filas.
El hábito seguro tiene tres pasos. Escribe un SELECT con el mismo WHERE. Comprueba que muestra las filas que querías. Luego cambia SELECT por UPDATE.
Paso 1: mira antes las filas
db "SELECT id, name, stock FROM student_depot.shelf WHERE stock < 15 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.
Paso 2: cambia justo esas filas
db "UPDATE student_depot.shelf SET stock = stock + 10 WHERE stock < 15"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Paso 3: vuelve a mirar
db "SELECT id, name, stock FROM student_depot.shelf 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.
DELETE quita filas para siempre
DELETE FROM quita las filas que cumplen su WHERE. Sin WHERE vacía la tabla entera.
No hay papelera. Valen los mismos tres pasos: primero SELECT, luego DELETE, y otra vez SELECT.
Quitar los guantes
db "DELETE FROM student_depot.shelf WHERE id = 100"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un error frecuente
Advertencia
Mucha gente cree que un UPDATE o un DELETE toca solo la fila que tiene en mente. Toca todas las filas que cumplen la condición, y sin WHERE son todas. Escribe primero el WHERE y compruébalo con un SELECT.
El error, solo en la copia
db "UPDATE student_depot.shelf SET 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.
Ver lo que hizo
db "SELECT id, name, stock FROM student_depot.shelf 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.
Una transacción es todo o nada
Mover 50 € entre dos cuentas son dos cambios. Si la máquina falla entre uno y otro, 50 € han desaparecido.
Una transacción agrupa los cambios. COMMIT los hace todos permanentes. ROLLBACK los deshace todos.
Hasta que haces commit, nadie más ve los cambios. El siguiente Run envía cuatro sentencias en una misma sesión: abre una transacción, borra todas las filas de la copia, la deshace y cuenta.
Borrarlo todo y deshacerlo
db "START TRANSACTION; DELETE FROM student_depot.shelf; ROLLBACK; SELECT COUNT(*) AS still_there FROM student_depot.shelf"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejemplo resuelto: un fallo a medias
| Paso | Cuenta 1 | Cuenta 2 | Sin transacción | Con transacción |
|---|---|---|---|---|
| Inicio | 200 € | 100 € | Bien | Bien |
| Tras el primer cambio | 150 € | 100 € | Faltan 50 € | Aún no es permanente |
| Fallo | 150 € | 100 € | Se queda mal | Se deshace: 200 € y 100 € |
| Los dos cambios y COMMIT | 150 € | 150 € | Bien | Bien |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Ver el modo por defecto
db "SELECT @@autocommit AS autocommit"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Por qué la respuesta es 1
Nota
Normalmente cada sentencia es una pequeña transacción que se confirma al instante. Por eso un UPDATE suelto no se puede deshacer. Para tener un rollback debes escribir antes START TRANSACTION, dentro de una misma sesión.