Clave primaria y clave foránea
En resumen: Una clave primaria es la columna que identifica de forma única cada fila de una tabla, y una clave foránea es una columna que guarda la clave primaria de una fila de otra tabla.
Problema
¿De quién es este pedido?
En la lección «La tienda» buscamos con los ojos quién hizo el pedido 60 y qué había en él. La respuesta estaba repartida en cuatro tablas: orders, customers, order_items y products.
¿Por qué la tienda no lo guarda todo en una sola tabla grande? ¿Y cómo «sabe» una tabla cuál es su fila en otra tabla?
La idea
Clave primaria
Casi todas las tablas de la tienda tienen una columna id. La excepción, order_items, está en la nota del final de la lección. El número es distinto en cada fila, nunca se repite y nunca está vacío. Por él se encuentra una fila sin ninguna duda:
Una columna así se llama clave primaria. Los nombres no sirven: dos clientes pueden llamarse igual, y un nombre puede cambiar. El número se queda.
SQLite te dice qué columna es la clave primaria. La columna pk vale 1 para ella:
La idea
Clave foránea
Un pedido no guarda el nombre del cliente. Guarda solo su id, en la columna customer_id:
customers
- PK
idinteger nametext *emailtext *citytextjoined_attext *
orders
- PK
idinteger - FK
customer_idinteger *→ customers ordered_attext *statustext *
orders.customer_id apunta a customers.id. Una columna que guarda la clave primaria de una fila de otra tabla se llama clave foránea.
Los vínculos de una tabla los muestra pragma_foreign_key_list:
Una fila, un vínculo: de la columna customer_id (from) a la columna id (to) de la tabla customers.
Así, los datos de Maria (nombre, correo) se guardan una sola vez. Si cambia su correo, se corrige en una fila de customers, y sus 12 pedidos siguen apuntando al mismo id.
Pruébalo
Las líneas del pedido
¿A qué tablas apunta order_items? Muestra sus vínculos.
Solución
SELECT * FROM pragma_foreign_key_list('order_items');SELECT * FROM pragma_foreign_key_list('order_items'). Dos vínculos: product_id apunta a products.id, y order_id a orders.id. Una fila de order_items dice: «este pedido contiene este producto».
Míralo
Buscar por número
Con WHERE ya no buscamos con los ojos. ¿Quién hizo el pedido 60? Primero el pedido:
customer_id es 1. Luego el cliente con ese id:
Maria Ivanova. Funciona, pero hacen falta dos consultas, y pasas el número 1 a mano. Para un pedido es soportable. Para un informe de 60 pedidos con los nombres de sus clientes, no. La próxima lección junta los dos pasos en una sola consulta con JOIN.
Pruébalo
¿De quién es la reseña?
La reseña 13 tiene una puntuación de 1. ¿Quién la escribió? Muestra solo el nombre del cliente.
Solución
SELECT customer_id FROM reviews WHERE id = 13;
SELECT name FROM customers WHERE id = 12;Dos pasos: SELECT customer_id FROM reviews WHERE id = 13 da 12, y SELECT name FROM customers WHERE id = 12 da Boris Mitev. La comprobación mira la última tabla.
Ejercicio
Dos tareas
1. Una reseña apunta a dos cosas. Muestra los vínculos de la tabla reviews.
Los vínculos de reviews:
Solución
SELECT * FROM pragma_foreign_key_list('reviews');SELECT * FROM pragma_foreign_key_list('reviews'). customer_id apunta a customers, y product_id a products: quién la escribió y sobre qué producto.
2. Las categorías forman un árbol: «Cocina» es una subcategoría de algo. La clave foránea parent_id apunta a una fila de la misma tabla categories. Encuentra el nombre de la categoría padre de «Cocina».
La categoría padre de «Cocina»:
Solución
SELECT parent_id FROM categories WHERE name = 'Cocina';
SELECT name FROM categories WHERE id = 2;SELECT parent_id FROM categories WHERE name = 'Cocina' da 2, y SELECT name FROM categories WHERE id = 2 da «Hogar». Una tabla puede apuntar a sí misma. En la lección sobre muchas tablas lo harás en una sola consulta.
Más precisamente, para curiosos
Una clave primaria puede estar formada por varias columnas. En order_items es el par (order_id, product_id): pk vale 1 y 2 para sus partes.
Una clave foránea es también una regla: la base rechaza un pedido de un cliente que no existe. En SQLite esta regla está desactivada por defecto y se activa con PRAGMA foreign_keys = ON. Aquí en el curso está activada. En PostgreSQL las claves foráneas se hacen cumplir siempre. Las verás en acción en el módulo sobre cambiar datos.
Test
Ponte a prueba
Lecciones relacionadas
Sección «Lecciones relacionadas»- Se basa en: Por qué una base de datos · SELECT: elegir columnas · WHERE: filtrar filas
- Continúa en: JOIN: dos tablas en una consulta · LEFT JOIN: también las filas sin pareja · Muchas tablas, y una tabla unida consigo misma · INSERT: insertar filas
- Ejercicios sobre el tema: Unir tablas