Dos clientes con el número 31
Un taller de reparaciones anota sus encargos en una hoja de cálculo. A dos clientes distintos les asignaron el mismo número, el 31.
Ahora el resguardo de uno muestra el teléfono del otro.
Una base de datos evita este error. Rechaza el segundo 31 antes de que haga daño.
Al terminar esta lección
Nota
Puedo crear tablas con claves en una base de datos relacional.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Tabla | filas y columnas que guardan una sola clase de cosa | |
| Tipo de dato | la clase de valor que admite una columna | INT |
| Clave primaria | la columna que identifica cada fila, sin repetirse | id |
| Clave foránea | una columna que apunta a una fila de otra tabla; también se llama clave ajena | route_id |
| Restricción | una regla que la base comprueba en cada cambio | NOT NULL |
| NULL | la marca de un valor que falta |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Una tabla guarda una sola clase de cosa
Una base de datos relacional guarda los datos en tablas. Cada tabla guarda una clase de cosa: clientes, productos o pedidos.
Cada columna tiene un tipo de dato. La base rechaza un texto en una columna de números.
Primero dile al terminal cómo entrar. Estos dos Run sirven para toda la lección.
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 la tienda
alias sql='mariadb -h db -u student -pstudent shop -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.
Mirar las columnas de una tabla
sql "DESCRIBE reviews"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: elegir un tipo
| Dato que guardar | Tipo | Por qué |
|---|---|---|
| Unidades de un producto | INT | Solo números enteros |
| Un precio en euros | DECIMAL(8,2) | Céntimos exactos, sin errores de redondeo |
| El nombre de una ciudad | VARCHAR(40) | Texto de hasta 40 caracteres |
| El día de un envío | DATE | La base puede calcular los días entre dos fechas |
| Si está descatalogado | BOOLEAN | Solo sí o no |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
La clave primaria identifica cada fila
Una clave primaria es una columna cuyo valor es distinto en cada fila. Nunca puede ser NULL.
Suele ser un número que cuenta la propia base, con AUTO_INCREMENT. La base rechaza una segunda fila con la misma clave.
Una clave puede usar dos columnas a la vez. Entonces el par no puede repetirse.
Una clave de dos columnas
sql "DESCRIBE order_items"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 nombre o un correo sirve de clave primaria. Los nombres se repiten y los correos cambian. Usa un número que cuente la base. Guarda el correo en una columna UNIQUE aparte.
La clave foránea apunta a otra tabla
Un paquete viaja por una ruta. La tabla de paquetes no copia los datos de la ruta. Guarda su número.
Esa columna es una clave foránea. La base comprueba que ese número exista en la tabla de rutas.
Así no puedes enviar un paquete por una ruta que no existe.
Ahora crea dos tablas propias
El laboratorio te deja crear cualquier base cuyo nombre empiece por student_. Vas a crear student_depot para una pequeña empresa de mensajería.
La base de la tienda queda como estaba. Ejecuta los Run en orden. Un Run que termina en error forma parte de la lección.
Crear tu propia base
sql "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.
Un nombre corto para ella
alias depot='mariadb -h db -u student -pstudent student_depot -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: borrar las dos tablas
depot "DROP TABLE IF EXISTS parcels, routes"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Crear la tabla de rutas
depot "CREATE TABLE routes (id INT AUTO_INCREMENT PRIMARY KEY, town VARCHAR(40) NOT NULL UNIQUE, days INT NOT NULL DEFAULT 1)"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Crear la tabla de paquetes
depot "CREATE TABLE parcels (id INT AUTO_INCREMENT PRIMARY KEY, route_id INT NOT NULL, weight_kg DECIMAL(5,2) NOT NULL, sent_on DATE NOT NULL, FOREIGN KEY (route_id) REFERENCES routes(id))"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 dos rutas
depot "INSERT INTO routes (town, days) VALUES ('Sevilla', 1), ('Bilbao', 2)"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Enviar un paquete por la ruta 9
depot "INSERT INTO parcels (route_id, weight_kg, sent_on) VALUES (9, 2.5, '2026-03-02')"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 Sevilla por segunda vez
depot "INSERT INTO routes (town) VALUES ('Sevilla')"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Intentar borrar la tabla de rutas
depot "DROP TABLE routes"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 allá
Dale repartidores a la empresa. Crea en student_depot una tabla drivers con una clave primaria numerada, un nombre y un número de carné UNIQUE.
Después añade a parcels una columna driver_id con ALTER TABLE, y una clave foránea de esa columna a drivers. Demuestra que cada regla funciona con una fila que la incumpla.