CodeGym /Cursos /SQL SELF /Claves externas: FOREIGN KEY

Claves externas: FOREIGN KEY

SQL SELF
Nivel 19 , Lección 0
Disponible

Imagina que tienes dos tablas: una con datos de estudiantes y otra con datos de cursos. ¿Cómo crees que podrías expresar qué estudiantes están inscritos en qué cursos? Podrías añadir una columna en la tabla de estudiantes para guardar todos los cursos en los que están inscritos, pero eso se vuelve un caos rapidísimo. ¡Una de las mejores soluciones es usar claves externas!

Clave externa (FOREIGN KEY) — es una columna o un conjunto de columnas que se usa para crear una relación entre tablas. Apunta a una columna (normalmente el PRIMARY KEY) en otra tabla, asegurando la integridad referencial de los datos entre ellas. Así que, si un estudiante está inscrito en un curso, podemos estar seguros de que ese curso realmente existe.

Las claves externas:

  • Ayudan a mantener la integridad de los datos, garantizando que los registros en una tabla correspondan a datos en otra.
  • Hacen que la base de datos sea clara y lógicamente organizada.
  • Simplifican el manejo de datos, previenen duplicados y errores.

Ejemplo de la vida real

Imagina una biblioteca. La tabla books contiene la lista de libros y la tabla members — la lista de lectores. Para saber quién ha cogido qué libro, podemos crear una tabla borrowed_books, que referencie a books y members mediante claves externas. Así, cada vez que alguien coge un libro, sabemos exactamente quién fue y qué libro se llevó.

Tipos de relaciones entre tablas

Las claves externas permiten describir diferentes relaciones entre tablas. Vamos a ver los tres tipos principales:

1. Relación "Uno a Uno" (ONE-TO-ONE)

Esta es la relación más simple, donde un registro en una tabla corresponde exactamente a un registro en otra tabla. Por ejemplo, la tabla users puede tener información de usuarios y la tabla profiles puede tener información adicional, como sus direcciones o fotos.

Ejemplo SQL para una relación ONE-TO-ONE:

CREATE TABLE users (
    user_id SERIAL PRIMARY KEY,
    username TEXT NOT NULL
);

CREATE TABLE profiles (
    profile_id SERIAL PRIMARY KEY,
    user_id INT UNIQUE REFERENCES users(user_id), -- referencia a users.user_id
    address TEXT
);

Aquí la columna user_id en la tabla profiles actúa como clave externa, apuntando a user_id en la tabla users.

Ejemplo de la tabla users:

user_id - PRIMARY KEY username
1 alice
2 bob
3 charlie

Ejemplo de la tabla profiles:

profile_id - PRIMARY KEY user_id - FOREIGN KEY address
1 1 Berlín, Alemania
2 2 París, Francia
3 3 Tokio, Japón

2. Relación "Uno a Muchos" (ONE-TO-MANY)

Esta es la relación más común. Por ejemplo, un cliente puede hacer muchos pedidos. En este caso, la tabla customers estará relacionada con la tabla orders usando una clave externa.

Ejemplo SQL para una relación ONE-TO-MANY:

CREATE TABLE customers (
    customer_id SERIAL PRIMARY KEY,
    name TEXT NOT NULL
);

CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    customer_id INT REFERENCES customers(customer_id),	-- referencia a customers.customer_id
    order_date DATE NOT NULL
);

La tabla orders puede tener muchos registros que apuntan a un solo registro en la tabla customers

Ejemplo de la tabla customers:

customer_id - PRIMARY KEY name
1 Alice
2 Bob
3 Charlie

Ejemplo de la tabla orders:

order_id - PRIMARY KEY customer_id - FOREIGN KEY order_date
1 1 2024-12-01
2 1 2024-12-05
3 2 2024-12-03
4 3 2024-12-07

3. Relación "Muchos a Muchos" (MANY-TO-MANY)

A veces un registro en una tabla puede estar relacionado con varios registros en otra tabla, y viceversa. Por ejemplo, los estudiantes se inscriben en cursos, y un curso puede tener muchos estudiantes. Para esto normalmente se crea una tabla intermedia.

Ejemplo SQL para una relación MANY-TO-MANY:

-- estudiantes
CREATE TABLE students (
    student_id SERIAL PRIMARY KEY,
    name TEXT NOT NULL
);

-- cursos
CREATE TABLE courses (
    course_id SERIAL PRIMARY KEY,
    title TEXT NOT NULL
);

-- "inscripción de un estudiante concreto en un curso concreto"
CREATE TABLE enrollments (
    student_id INT REFERENCES students(student_id), -- referencia al id del estudiante
    course_id INT REFERENCES courses(course_id),	-- referencia al id del curso
    PRIMARY KEY (student_id, course_id)
);

Aquí la tabla enrollments hace de "puente" entre las tablas students y courses.

Ejemplo de la tabla students:

student_id - PRIMARY KEY name
1 Alice
2 Bob
3 Charlie

Ejemplo de la tabla courses:

course_id - PRIMARY KEY title
1 SQL Básico
2 Estructuras de Datos
3 Algoritmos

Ejemplo de la tabla enrollments:

student_id - FOREIGN KEY course_id - FOREIGN KEY
1 1
1 2
2 1
3 3

Ventajas de usar claves externas

  1. Los datos se mantienen consistentes. Si una clave externa apunta a un registro que no existe, PostgreSQL no te dejará insertar o actualizar los datos.
  2. Facilita el trabajo con tablas. Las claves externas permiten conectar fácilmente los datos entre tablas y hacer consultas complejas como JOIN.
  3. Comportamiento automático. Puedes configurar acciones al borrar o actualizar registros relacionados (por ejemplo, borrado en cascada, poner NULL, etc.).

¿Cómo se ve una clave externa en PostgreSQL?

Sintaxis para crear una clave externa al crear una tabla:

CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    customer_id INT REFERENCES customers(customer_id)   -- clave externa referencia
);

Aquí:

  • customer_id — es la clave externa.
  • Hace referencia a customer_id en la tabla customers.

También puedes especificar la clave externa explícitamente usando FOREIGN KEY:

CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    customer_id INT,
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

Dato curioso

El término "clave externa" (FOREIGN KEY) viene de la teoría de bases de datos relacionales, desarrollada en los años 70 por Edgar Codd. Es flipante, pero la idea principal es tan potente que sigue siendo un elemento clave en las bases de datos modernas. ¿Quién dijo que lo clásico no está de moda?

Ahora ya entiendes qué es una clave externa y por qué es tan importante. Todavía te queda aprender cómo crearlas al crear tablas y cómo usar correctamente las operaciones en cascada. ¡Pero eso lo veremos en las siguientes lecciones!

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION