Creacion De Llaves en Postgresql
En esta serie de artículos, revisamos los conceptos básicos de la programación de bases de datos con PostgreSQL, el artículo anterior vimos como llevar a cabo selecciones y modificaciones básicas sobre tablas. Pero, la gran ventaja de utilizar bases de datos relacionales es precisamente la capacidad de generar, definir y explotar relaciones entre las entidades que ocupan la tabla.
Existen diferentes casos para la creación de llaves primarias y foráneas. Estos casos dependen en general de si la tabla existe previamente o no.
Definir llaves primarias al construir la tabla
Al momento de crear una tabla, podemos definir las llaves primarias de la siguiente manera:
CREATE TABLE mytable (
column_1 data_type PRIMARY KEY,
column_2 data_type, ...
);
Un ejemplo con una tabla de empleados puede utilizar el número de empleado como un identificador único para cada una de las filas.
CREATE TABLE employees (
empl_id INT PRIMARY KEY,
empl_fn VARCHAR 256,
empl_ln VARCHAR 256,
empl_dept_id INT,
...
);
Definir llaves primarias en tablas pre existentes
Para definir una llave primaria en una tabla que ya existe, necesitamos utilizar el comando ALTER para modificar la tabla de nuestro interés.
Por ejemplo:
ALTER TABLE table_1 ADD PRIMARY KEY (column_1, ...);
Este comando nos permite modificar la tabla creando la llave primaria y nuestra llave primaria puede tener una o varias columnas.
Siguiendo nuestro ejemplo de la base de empleados imaginemos que tenemos un catálogo de departamentos definido por la siguiente tabla:
CREATE TABLE cat_departments (
cat_dept_id INT,
dept_name VARCHAR(100)
);
Una vez creada esa tabla podemos modificarla con el siguiente comando:
ALTER TABLE cat_departments ADD PRIMARY KEY (cat_dept_id);
Lo0 importante es que antes de hacerlo verifiquemos que se cumplan las restricciones de las llaves primarias y la columna cat_dept_id
contenga valores únicos.
Definir llaves foráneas al crear una tabla
Las llaves foráneas, son las que definen las relaciones entre las tablas ly vuelven a las bases de datos relacionales, pues, relacionales. Definen como se relacionan las tablas y que ocurre cuando cambia una llave en otra tabla con los datos de la tabla que contiene la llave como una llave foránea.
Regresando a nuestro ejemplo de la tabla de empleados y la tabla de departamentos:
CREATE TABLE employees (
empl_id INT PRIMARY KEY,
empl_fn VARCHAR 256,
empl_ln VARCHAR 256,
empl_dept_id INT,
...
);
esta es la tabla de empleados, y tenemos una columna llamada empl_dept_id
, esta columna queremos que se relacione como llave foránea a nuestra tabla catálogo de departamentos. Por lo que al declararla la podemos definir de la siguiente manera:
CREATE TABLE employees (
empl_id INT PRIMARY KEY,
empl_fn VARCHAR 256,
empl_ln VARCHAR 256,
empl_dept_id INT REFERENCES cat_departments(cat_dept_id) ON DELETE RESTRICT,
...
);
aqui incorporamos otro detalle, la palabra clave REFERENCES
indica que una clumna hace referencia a la otra y la cláusula ON DELETE
nos dice cuales van a ser las acciones que van a pasar con nuestros registros de empleados cuando borremos la llave del catálogo. En este caso vamos a restringir que no se puedan borrar registros del catálogo hasta que no se hayan eliminado todas las referencias a dicha llave. Así si un departamento cambia de clave, o es eliminado, no perdemos los registros de los empleados de ese departamento.
Definir llaves foráneas en tablas pre existentes
Tambien podemos definir relaciones entre tablas que ya están creadas, utilizando una vez mas el comando ALTER
:
ALTER TABLE my_table_w_fk
ADD CONSTRAINT constraint FOREIGN KEY (c1) REFERENCES my_table_w_pk (pk_column);
Este comando nos pide que alteremos la tabla my_table_with_fk
y le añadamos la restricción constraint
(en este caso nos pide que le demos un nombre a la restricción, cuando las generamos desde la creación de la tabla, Postgres les asigna nombres automáticamente a las restricciones), le decimos que queremos una restricción de tipo FOREIGN KEY
y que sea cobre la columna c1
y referencia la columna pk_column
de la tabla my_table_w_pk
.
Regresando a nuestro ejemplo del catálogo de empleados:
ALTER TABLE employees ADD CONSTRAINT cat_dept_fk FOREIGN KEY (empl_dept_id) REFERENCES cat_departments(cat_dept_id) ON DELETE RESTRICT;
Conclusiones
Como se puede ver la creación de restricicones de relación entre tablas en POstgreSQL es sencilla y puede ser llevada a cabo tanto al momento de creación de las tablas o de manera posterior, si se descubre que esa relación es necesaria o es mas utilizada al momento de analizar la base o de reportar.