Introducción
En este tema, aprenderemos sobre dos conceptos fundamentales en el diseño de bases de datos relacionales: las claves primarias y las claves foráneas. Estos conceptos son esenciales para garantizar la integridad y la relación entre los datos en diferentes tablas.
Claves Primarias
¿Qué es una Clave Primaria?
Una clave primaria es un campo (o una combinación de campos) en una tabla que se utiliza para identificar de manera única cada fila en esa tabla. Las características principales de una clave primaria son:
- Unicidad: Cada valor en la clave primaria debe ser único.
- No Nulo: Los valores de la clave primaria no pueden ser nulos.
Creación de una Clave Primaria
Para definir una clave primaria en PostgreSQL, se utiliza la cláusula PRIMARY KEY
al crear una tabla. Veamos un ejemplo:
CREATE TABLE empleados ( empleado_id SERIAL PRIMARY KEY, nombre VARCHAR(100) NOT NULL, puesto VARCHAR(50) NOT NULL, salario DECIMAL(10, 2) NOT NULL );
En este ejemplo:
empleado_id
es la clave primaria de la tablaempleados
.SERIAL
es un tipo de dato que genera automáticamente un número secuencial único para cada fila.
Claves Primarias Compuestas
En algunos casos, una sola columna no es suficiente para identificar de manera única una fila. En tales situaciones, se puede utilizar una clave primaria compuesta, que consiste en más de una columna.
CREATE TABLE inscripciones ( estudiante_id INT, curso_id INT, fecha_inscripcion DATE, PRIMARY KEY (estudiante_id, curso_id) );
En este ejemplo, la combinación de estudiante_id
y curso_id
se utiliza como clave primaria.
Claves Foráneas
¿Qué es una Clave Foránea?
Una clave foránea es un campo (o una combinación de campos) en una tabla que se utiliza para establecer y reforzar un vínculo entre los datos de dos tablas. La clave foránea en una tabla apunta a una clave primaria en otra tabla, creando una relación entre las dos tablas.
Creación de una Clave Foránea
Para definir una clave foránea en PostgreSQL, se utiliza la cláusula FOREIGN KEY
. Veamos un ejemplo:
CREATE TABLE departamentos ( departamento_id SERIAL PRIMARY KEY, nombre VARCHAR(100) NOT NULL ); CREATE TABLE empleados ( empleado_id SERIAL PRIMARY KEY, nombre VARCHAR(100) NOT NULL, puesto VARCHAR(50) NOT NULL, salario DECIMAL(10, 2) NOT NULL, departamento_id INT, FOREIGN KEY (departamento_id) REFERENCES departamentos(departamento_id) );
En este ejemplo:
departamento_id
en la tablaempleados
es una clave foránea que referencia adepartamento_id
en la tabladepartamentos
.
Integridad Referencial
La integridad referencial asegura que los valores de la clave foránea en una tabla deben coincidir con los valores de la clave primaria en la tabla referenciada. PostgreSQL proporciona varias acciones que se pueden tomar cuando se actualiza o elimina una fila en la tabla referenciada:
ON DELETE CASCADE
: Elimina las filas en la tabla hija cuando se elimina la fila en la tabla padre.ON UPDATE CASCADE
: Actualiza las filas en la tabla hija cuando se actualiza la fila en la tabla padre.ON DELETE SET NULL
: Establece la clave foránea enNULL
cuando se elimina la fila en la tabla padre.ON DELETE RESTRICT
: Impide la eliminación de la fila en la tabla padre si hay filas relacionadas en la tabla hija.
Ejemplo:
CREATE TABLE empleados ( empleado_id SERIAL PRIMARY KEY, nombre VARCHAR(100) NOT NULL, puesto VARCHAR(50) NOT NULL, salario DECIMAL(10, 2) NOT NULL, departamento_id INT, FOREIGN KEY (departamento_id) REFERENCES departamentos(departamento_id) ON DELETE CASCADE );
Ejercicios Prácticos
Ejercicio 1: Crear Tablas con Claves Primarias y Foráneas
-
Crea una tabla
clientes
con las siguientes columnas:cliente_id
(clave primaria, tipoSERIAL
)nombre
(tipoVARCHAR(100)
)email
(tipoVARCHAR(100)
)
-
Crea una tabla
pedidos
con las siguientes columnas:pedido_id
(clave primaria, tipoSERIAL
)fecha_pedido
(tipoDATE
)cliente_id
(clave foránea que referencia acliente_id
en la tablaclientes
)
Solución
CREATE TABLE clientes ( cliente_id SERIAL PRIMARY KEY, nombre VARCHAR(100) NOT NULL, email VARCHAR(100) NOT NULL ); CREATE TABLE pedidos ( pedido_id SERIAL PRIMARY KEY, fecha_pedido DATE NOT NULL, cliente_id INT, FOREIGN KEY (cliente_id) REFERENCES clientes(cliente_id) );
Ejercicio 2: Integridad Referencial
- Modifica la tabla
pedidos
para que, cuando se elimine un cliente, también se eliminen todos sus pedidos.
Solución
CREATE TABLE pedidos ( pedido_id SERIAL PRIMARY KEY, fecha_pedido DATE NOT NULL, cliente_id INT, FOREIGN KEY (cliente_id) REFERENCES clientes(cliente_id) ON DELETE CASCADE );
Conclusión
En esta sección, hemos aprendido sobre las claves primarias y foráneas, su importancia en el diseño de bases de datos y cómo implementarlas en PostgreSQL. Estos conceptos son fundamentales para mantener la integridad y la relación entre los datos en una base de datos relacional. En el próximo módulo, exploraremos más sobre el diseño de bases de datos y la normalización.
Curso de PostgreSQL
Módulo 1: Introducción a PostgreSQL
Módulo 2: Operaciones Básicas de SQL
- Creando Bases de Datos y Tablas
- Insertando Datos
- Consultando Datos
- Actualizando Datos
- Eliminando Datos
Módulo 3: Consultas Avanzadas de SQL
Módulo 4: Diseño de Bases de Datos y Normalización
Módulo 5: Características Avanzadas de PostgreSQL
Módulo 6: Ajuste de Rendimiento y Optimización
- Optimización de Consultas
- Estrategias de Indexación
- Análisis del Rendimiento de Consultas
- Vacuuming y Mantenimiento
Módulo 7: Seguridad y Gestión de Usuarios
Módulo 8: Trabajando con JSON y Características NoSQL
Módulo 9: Extensiones y Herramientas Avanzadas
- PostGIS para Datos Geoespaciales
- Búsqueda de Texto Completo
- Wrappers de Datos Externos
- PL/pgSQL y Otros Lenguajes Procedurales