Saltar al contenido

Claves foráneas

SQL · Unidad 12: Diseñar tablas

En la unidad 7 se dijo que esta base «rechaza un pedido del cliente 99». En la pasada viste esa regla parar un pedido de un producto que no existía. ¿Dónde está escrito que un pedido necesita un cliente y un producto que existan?

En la sentencia que creó pedidos, que es esta. En una base de verdad se lee, y no se vuelve a correr. Correrla pide tirar antes la tabla que existe, y sus doce filas se van con ella. En esta app vuelven en la siguiente ejecución.

REFERENCES clientes(id) va detrás del tipo, como las demás reglas. Dice que cada cliente_id tiene que ser el id de alguna fila de clientes. Eso es una clave foránea, y pedidos tiene dos.

DROP TABLE pedidos;
CREATE TABLE pedidos (
  id INTEGER PRIMARY KEY,
  cliente_id INTEGER NOT NULL
    REFERENCES clientes(id),
  producto_id INTEGER NOT NULL
    REFERENCES productos(id),
  cantidad INTEGER NOT NULL,
  fecha TEXT NOT NULL
);
SELECT COUNT(*) AS filas
FROM pedidos;

Devuelve

filas
0

El resto de la explicación está en la lección, que es del plan completo.

Ejercicios de esta lección

Se hacen en la app, que los corrige al momento y explica por qué.

  1. 1. Opción múltiple

    La tienda tiene ocho productos, del 1 al 8. Con esta tabla hecha, llegan tres sentencias más, una por una. ¿Cuál rechaza la base?

  2. 2. Completa el código

    Ahora la tabla guarda de quién es cada opinión. Ana, la clienta 1, deja 5 estrellas. Completa la clave foránea.

  3. 3. Ordena las líneas

    Ordena la tabla de opiniones, con su clave foránea hacia productos, una opinión de 4 estrellas sobre los Audífonos, el producto 7, y el SELECT que la enseña. Sobran dos líneas.

  4. 4. Encuentra el bug

    La tabla de opiniones se crea sin error. Al guardar la primera opinión, aquí SQL contesta no such table: main.producto, y señala el INSERT. ¿Qué línea tiene el problema?

  5. 5. Encuentra el caso que falla

    La tienda guarda una opinión de 4 estrellas sobre los Audífonos, el producto 7. Quien hizo la tabla escribió mal la clave foránea, y hoy no se nota. ¿Con cuál de estos cambios, hechos antes, la base rechaza esa opinión?

  6. 6. Ordena las líneas

    Otro ensayo, que en una base de verdad se haría con ALTER TABLE y sin perder nada. La tienda quiere rehacer clientes con una columna para el correo, que no se pueda repetir. Para que quepa, el ensayo deja fuera ciudad y edad. Ordena las sentencias que tiran lo que haga falta, crean la tabla nueva y la consultan, todavía vacía. Sobran dos líneas.

  7. 7. Predice la salida

    Esta vez cliente_id no lleva NOT NULL. Ana, la clienta 1, deja 5 estrellas, y alguien que no dice quién es deja 2. ¿Qué devuelve el SELECT?

  8. 8. Escribe el código

    La tienda apunta lo que le compra a cada proveedor. La tabla proveedores ya está escrita. Debajo, crea compras con cuatro columnas, en este orden. id va como siempre. proveedor_id es un entero obligatorio que apunta al id de proveedores. producto_id es un entero obligatorio que apunta al id de productos. unidades es un entero obligatorio. Escribe el tipo como INTEGER.

Hacer esta lección

Se abre en el navegador. Esta lección es del plan completo; la primera unidad de cada curso es gratis.

Ver todas las lecciones →