Creación de Llaves Foráneas en Bases de Datos con PGAdmin
Resumen
¿Cómo establecer relaciones entre tablas con llaves foráneas?
El mundo de las bases de datos es fascinante y vital para gestionar adecuadamente la información. Uno de los conceptos más importantes es el uso de llaves foráneas para asegurar la consistencia de los datos. Una llave foránea permite establecer relaciones entre tablas y asegurar que la información sea congruente. Aquí exploraremos cómo se crean y gestionan estas relaciones usando PG Admin, asegurando que cada dato en una tabla coincida correctamente con su contraparte en otra.
¿Qué son las llaves foráneas y por qué son importantes?
Las llaves foráneas son un elemento crucial en el diseño de bases de datos. Permiten definir relaciones entre distintas tablas, asegurando que la información sea coherente. Por ejemplo, si en una tabla de pasajeros existe un ID de viaje, este debería corresponder con un registro real en la tabla de viajes. Esto asegura que no haya datos sueltos o inconsistentes, respetando las reglas de integridad referencial.
Elementos clave de las llaves foráneas:
Tabla de origen: la tabla donde se encuentra el campo que será referenciado.
Tabla destino: la tabla que contiene el campo que se usa como referencia.
Acciones en caso de cambios: definir cómo se comporta la relación frente a cambios en la tabla de origen.
¿Cómo crear llaves foráneas en PG Admin?
Con PG Admin, crear y gestionar llaves foráneas es un proceso relativamente sencillo:
Acceder a la tabla de interés: Una vez en PG Admin, selecciona la tabla donde deseas crear la relación.
Crear la relación: Ve a la sección de propiedades de la tabla, selecciona la pestaña de llaves foráneas y agrega una nueva relación.
Definir la llave foránea:
Asigna un nombre estándar, como nombreTablaOrigen_nombreTablaDestino_FK.
Selecciona las columnas a relacionar.
Define acciones ante modificaciones o eliminaciones.
¿Qué acciones configurar para mantener la integridad?
Es fundamental definir las acciones apropiadas para las llaves foráneas cuando hay modificaciones en las tablas.
ON UPDATE CASCADE: Si el ID en la tabla de origen cambia, reflejar el mismo cambio en la tabla destino.
ON DELETE CASCADE: Al eliminar un registro en la tabla de origen, también se elimina el correspondiente en la tabla destino.
NO ACTION o RESTRICT: No permite cambios o eliminaciones que puedan romper la relación de integridad.
Estas configuraciones garantizan que no haya vínculos rotos o huecos de información en el sistema.
Implementación práctica: relaciones entre tablas de trayecto y tren
El proceso de creación de llaves foráneas puede variar ligeramente según las tablas involucradas. Para relacionar trayectos con trenes:
Define la relación en PG Admin: Usa la GUI para seleccionar la tabla de trayectos y definir la relación a la tabla de trenes.
Acciones específicas: Configura ON UPDATE CASCADE y ON DELETE CASCADE para asegurar que cualquier cambio en la tabla de tren refleje adecuadamente en trayectos.
¿Cómo realizar consultas para verificar las relaciones?
Una vez creadas las relaciones, es importante verificar que se aplican correctamente:
Revisar la descripción de la tabla: Asegura que las llaves foráneas aparecen listadas con las acciones configuradas.
Ejecutar una consulta de ejemplo: Permite verificar que los cambios en las tablas de origen afectan correctamente a las tablas destino según lo definido.
Las llaves foráneas son vitales para el funcionamiento sólido de bases de datos relacionales, asegurando que la información siempre esté sincronizada y completa. ¿Estás listo para llevar tu gestión de bases de datos al siguiente nivel? ¡Comienza a implementar estas estrategias hoy mismo usando PG Admin!
Hay que tener bastante cuidado con el borrado y la actualizacion en cascada, esto podria generar cuellos de botella en el rendimento del aplicativo cuando se modifica la llave y borrar informacion puede ser una opcion devastadora para la integridad de la informacion.
Generalmente en la práctica esto no se permite, la supresión de un registro es lógico no físico esto es para garantizar la consistencia y entre otras reglas la auditoria.
Exacto Maslov, es muy muy raro ver algún script de Delete en la industria, casi siempre son banderas de creación y de borrado así como sus fechas
En la pestania Action le tenemos que decir que hacer a la base de datos entre la tabla origen y la tabla destino cuando ocurra un cambio:
NO ACTION: No hacer nada
RESTRICT: Decirle a Postgres que no podemos permitir que la tabla cambie algo.
CASCADE: Si cambio la tabla de origen, la tabla destino tambien cambia.
SET NULL quiere decir que nuestra columna en esa fila va a dejar de tener por ejemplo el ID que tenia asociado un 77 y va a convertirse en NULL. Esto por que la tabla destino recibe un cambio y le decimos aPostgres que lo ponga en nulo.
SET DEFAULT: Si hay un cambio en la tabla origen nuestra tabla destino ponga un valor predeterminado. En un ejemplo un id podra quedar NULL.
Buen resumen de las acciones
Muchas gracias por el aporte.
Excelente clase, lo uníco que este video debería estar inmediatamente despues de la creacion de tablas porque estuve sufriendo un poco para hacer la relacion de las llaves foreaneas.
totalmente de acuerdo
Oh sí, tiene mucho sentido lo que dices.
Platzi URGE revisar esta clase y el curso completo, creo que falta que explique con un poco mas de lógica todo lo que se va haciendo para que las personas logren entender mejor, no es solo COMANDOS es entender lo que se genera como producto final y a que soluciones se llega con la herramienta.
Te recomiendo el curso de fundamentos de base de datos, Israell es muy bueno explicando que onda con las bases de datos desde cero. https://platzi.com/cursos/bd/
En el curso de fundamentos de Base de datos el profesor explica bien la teoría de las bases de datos
LLaves Foranes
Consistencia
Estructura
Tabla origen
Tabla destino
Acciones
--Agregamos llave foranea de id_estacion a la tabla trayecto
ALTERTABLEpublic.trayectoADDCONSTRAINT trayecto_estacion_fkey FOREIGNKEY(id_estacion)REFERENCESpublic.estacion(id)MATCHSIMPLEONUPDATECASCADEONDELETECASCADENOTVALID;--Agregamos llave foranea de id_tren a la tabla trayecto
ALTERTABLEpublic.trayectoADDCONSTRAINT trayecto_tren_fkey FOREIGNKEY(id_tren)REFERENCESpublic.tren(id)MATCHSIMPLEONUPDATECASCADEONDELETECASCADENOTVALID;--Agregamos llave foranea de id_trayecto a la tabla viaje
ALTERTABLEpublic.viajeADDCONSTRAINT viaje_trayecto_fkey FOREIGNKEY(id_trayecto)REFERENCESpublic.trayecto(id)MATCHSIMPLEONUPDATECASCADEONDELETECASCADENOTVALID;--Agregamos llave foranea de id_pasajero a la tabla viaje
ALTERTABLEpublic.viajeADDCONSTRAINT viaje_pasajero_fkey FOREIGNKEY(id_pasajero)REFERENCESpublic.pasajero(id)MATCHSIMPLEONUPDATECASCADEONDELETECASCADENOTVALID;--Para borrar una llave foranea por si tienes algun error
ALTERTABLEpublic.viajeDROPCONSTRAINT viaje_trayecto_fkey;
Muchas gracias por compartir
Muy útil, muchas gracias compañero!
Si alguien se adelanto y necesitan hacer una modificacion a sus CONSTRAINT, la solucion es la siguiente
Ya habia aplicado las FK por mi cuenta al momento de crear las tablas, pero de igual manera aprendi un par de tips que no habia tenido en cuenta.
Igual yo
Hice lo mismo pero ahora no sé cómo modificar lo de Action porque no lo puse :'v
Pestaña Action: Cuando se produce un cambio en un llave primaria esta afectará a su llave foránea, con Action especificamos el resultado que queremos.
Buena definición.
Considero que hay que evaluar muy bien estas opciones, porque no queremos que la integridad de los datos se vea afectada. Cuando se usa la opcion en CASCADA...se corre el riesgo de la informacion de la tabla destino quede ADULTERADA O INCOMPLETA... en muchas ocasiones no queremos que aunque se elimine un registro de las entidades principales, esto afecte a las tablas destino relacionadas. En estos casos no conviene usar esta opcion de CASCADA.
SQL era un tema que siempre quise aprender desde la universidad y estar en este proceso se siente tan increíble. Excelente la forma en la que Oswaldo explica.
Platzi revisar el curso completo, creo que falta que explique con un poco mas de lógica todo lo que se va haciendo y no ir saltando de una cosa a otra para que las personas logren comprender mejor.
Antes de este curso podés hacer el de Fundamentos de base de datos y luego volver a hacer este. El profesor es excelente y explica todo en detalle. https://platzi.com/cursos/bd/
Llaves foráneas
Una llave foranea es la manera en que los datos son relacionados entre tablas. La tabla base u origen debe contener obligatoriamente una llave primaria, mientras que la tabla de referenciada o destino debe tener un campo alusivo a la llave primaria de la tabla origen.
Existen diversas opciones para generar la relacion entre las tablas que tienen que ver con la operabilidad y el comportamiento del flujo de información, como el manejo en cascada de acciones de tabla (update y delete), la forma en que se va a construir la llave (validar la integridad de información o no hacerlo al momento de crearla) y demás operaciones de performance.
El objetivo prinicipal de una llave foránea es asegurar la integridad de información y dar sentido al modelo relacional de bases de datos. Su uso es adecuado por temas de normalización, sin embargo, no es suficiente con generar relaciones. Estas deben analizarse con respecto al consumo de información, ya que pueden ser motivo de ralentización de datos y problemas de performance en casos no optimizados (como indexado, por ejemplo).
si tienen problema con el error de no ahi constrain unique esto les salvara horas [](alter table if exists public.estacion ADD primary key (id);)
Sos el mejor, múchisimas gracias. Llevaba horas.
Al momento de querer hacer la llave foránea me sale este error
Asegúrate que el ID de la tabla trayecto sea PK
Muchas gracias no me di cuenta que hice mal la relacion de la tabla gracias amigo @erasmus
Por alguna razón el código del profe no me funciono, les dejo el que si me funciono por si alguien tiene el mismo problema.
ALTER TABLE IF EXISTS public."Trayecto"
ADD CONSTRAINT trayecto_tren_fkey FOREIGN KEY (id_tren)
REFERENCES public."Trenes" (id) MATCH SIMPLE
ON UPDATE CASCADE
ON DELETE CASCADE;
Muchas gracias pense que estaba haciendo todo mal
----Creación de la tabla Viaje--CREATETABLEpublic.viaje( id serial NOTNULL, id_pasajero integer, id_trayecto integer, inicio date, fin date,CONSTRAINT viaje_pkey PRIMARYKEY(id),CONSTRAINT viaje_pasajero_fkey FOREIGNKEY(id_pasajero)REFERENCESpublic.pasajero(id)MATCHSIMPLEONUPDATECASCADEONDELETECASCADENOTVALID,CONSTRAINT viaje_trayecto_fkey FOREIGNKEY(id_trayecto)REFERENCESpublic.trayecto(id)MATCHSIMPLEONUPDATECASCADEONDELETECASCADENOTVALID)WITH(OIDS=FALSE);ALTERTABLEpublic.viajeOWNER to postgres;COMMENTONTABLEpublic.viajeIS'Esta tabla contiene datos sobre los viajes que pueden hacer los pasajeros ';COMMENTONCONSTRAINT viaje_pasajero_fkey ONpublic.viajeIS'Este campo hace referencia al ID de la tabla pasajero';COMMENTONCONSTRAINT viaje_trayecto_fkey ONpublic.viajeIS'Este campo hace referencia al ID de la tabla trayecto';----Creación de la tabla trayecto
--CREATETABLEpublic.trayecto( id serial NOTNULL, id_tren integer, id_estacion integer,CONSTRAINT trayecto PRIMARYKEY(id_tren),CONSTRAINT trayecto_tren_fkey FOREIGNKEY(id_tren)REFERENCESpublic.tren(id)MATCHSIMPLEONUPDATECASCADEONDELETECASCADENOTVALID,CONSTRAINT trayecto_estacion_fkey FOREIGNKEY(id_estacion)REFERENCESpublic.estacion(id)MATCHSIMPLEONUPDATECASCADEONDELETECASCADENOTVALID)WITH(OIDS=FALSE);ALTERTABLEpublic.trayectoOWNER to postgres;COMMENTONTABLEpublic.trayectoIS'Registra los trayectos que pueden hacer los trenes entre estaciones';COMMENTONCONSTRAINT trayecto_tren_fkey ONpublic.trayectoIS'Referencia al ID de la tabla tren';COMMENTONCONSTRAINT trayecto_estacion_fkey ONpublic.trayectoIS'Referencia al ID de la tabla estacion';--Como agregar constrains manualmente
ALTERTABLE trayecto ADDCONSTRAINT trayecto_tren_fkey FOREIGNKEY(id_tren)REFERENCESpublic.tren(id)MATCHSIMPLEONUPDATECASCADEONDELETECASCADENOTVALID,ALTERTABLE trayecto ADDCONSTRAINT trayecto_estacion_fkey FOREIGNKEY(id_estacion)REFERENCESpublic.estacion(id)MATCHSIMPLEONUPDATECASCADEONDELETECASCADENOTVALID
No se explico que significa el NOT VALID y ademas el profesor creo algunas llaves con esta condición y otras no. En resumen si una llave foranea incluye esta sentencia no tiene la restricción de que la información de esta columna deba ser una llave foranea.
Yo tuve un error porque en el nombre de la columna id_tren puse un espacio, de la siguiente manera "id_tren ", en pgAdmin el error no era tan explícito, pero no me dejaba añadir la llave foránea, por lo cual lo hice en SQL Shell directamente con los comandos y ahí ya me decía que la columna "id_tren" no existía, porque difería de mi nombre por ese espacio adicional que puse sin darme cuenta.
Información resumida de esta clase
#EstudiantesDePlatzi
Las llaves foreanas son la relación que existe dentro de las tablas, su estructura se compone de tabla de origen, tabla de destino y acciones
Por estándar el nombre de la llave foreana va: Tabla de origen, tabla de destino y fkey
En la pestaña acción le decimos que debe hacer la base de datos cuando ocurra un cambio