En esta lección aprenderemos sobre las claves externas y cómo ayudan a crear una relación entre las tablas.
Clave externa 🔑
Una clave externa es una restricción que vincula una columna específica con los datos de otra tabla. Esta restricción garantiza la integridad de los datos.
CREATE TABLE users (
id bigint PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
birthday DATE,
email_confirmed BOOLEAN,
email VARCHAR(255) UNIQUE NOT NULL,
gender VARCHAR(255) NOT NULL,
password_digest VARCHAR(255) NOT NULL,
first_name VARCHAR(50),
last_name VARCHAR(50),
created_at TIMESTAMP NOT NULL
);
CREATE TABLE topics (
id bigint PRIMARY KEY,
-- la tabla topics está relacionada con la tabla users
user_id bigint REFERENCES users(id) NOT NULL,
title varchar(255),
body text,
created_at TIMESTAMP NOT NULL
);
INSERT INTO users
(birthday, created_at, email, first_name, gender, id, last_name, password_digest, username)
VALUES ('2022-05-25 06:39:51.694', '2022-06-14 18:31:05.296', 'Trevion53@yahoo.com',
'Lucienne', 'female', 1, 'Feil', '1111', 'Duncan3');
INSERT INTO users
(birthday, created_at, email, first_name, gender, id, last_name, password_digest, username)
VALUES ('2022-01-13 22:38:14.676', '2022-06-14 02:04:13.104', 'Baylee52@yahoo.com',
'Ramiro', 'female', 2, 'Wolf', '1111', 'Michaela11');
Ver en DB Fiddle
En la tabla temas, el atributo usuario_id está vinculado con el atributo id de la tabla usuarios. Sintácticamente, esto se logra añadiendo la palabra clave REFERENCES después del tipo de campo. Luego se añade el nombre de la tabla que se estará vinculando. Entre paréntesis se indica el campo con el cual se creará esta relación.
Si intentas insertar en
temasun registro con un valorusuario_idque no se encuentra en la tablausuarios, se producirá un error-- Los primeros dos pedidos se ejecutarán INSERT INTO topics (body, created_at, id, title, user_id) VALUES ('Architecto id autem modi.', '2022-06-14 12:09:50.532', 1, 'est iste corporis', 1); INSERT INTO topics (body, created_at, id, title, user_id) VALUES ('Eum aut dolore aut molestias aliquid quidem. Qui sit id vel id aut aliquam et facilis numquam. Expedita laboriosam aut sit dolor quia perspiciatis dicta dolores nihil. Dolorem maiores consequuntur assumenda similique eius quis nostrum. Dolor maiores natus. Maiores labore debitis incidunt libero excepturi velit porro.', '2022-06-14 13:20:33.943', 2, 'eveniet aut facere', 2); INSERT INTO topics (body, created_at, id, title, user_id) VALUES ('Velit quia molestiae doloremque velit rerum odit ea. Voluptatem esse provident. Ullam voluptates cumque omnis dolor illum reiciendis.', '2022-06-14 06:11:14.373', 4, 'et ut quos', 3); -- Error de consulta: error: la inserción o actualización en la tabla "temas" viola la restricción de clave externa "temas_usuario_id_fkey"Ver en DB Fiddle
Si intentas eliminar un registro de
usuariosque tiene referencias en la tablatemas, se producirá un errorDELETE FROM usuarios WHERE id = 1; -- Error de consulta: error: la actualización o eliminación en la tabla "usuarios" -- viola la restricción de clave externa "temas_usuario_id_fkey" en la tabla "temas"Ver en DB Fiddle
La clave externa verifica la integridad de los datos y evita la aparición de "basura". Por lo tanto, es mejor poner las claves externas en todos los identificadores para los que existe una tabla padre en la base de datos.
Las claves externas admiten diversas variaciones. De este modo, mantienen la integridad sin causar errores al intentar eliminar un registro.
Opción 1 - Eliminación en cascada:
CREATE TABLE topics (
user_id bigint REFERENCES users(id) ON DELETE CASCADE,
);
Ver en DB Fiddle
En esta opción, al intentar eliminar el registro padre (usuarios), todos los registros en temas que se refieran a ese usuario se eliminarán. La eliminación en cascada es una opción peligrosa, ya que puedes perder datos accidentalmente. Deberías pensar bien antes de habilitarla.
Opción 2 - Los registros permanecen, pero se coloca un null en lugar del identificador:
CREATE TABLE topics (
user_id bigint REFERENCES users(id) ON DELETE SET NULL,
);
Ver en DB Fiddle
Se utiliza con poca frecuencia, pero a veces puede ser útil.
Conclusiones
En esta lección aprendimos sobre las claves externas. Ellas proporcionan una relación entre dos tablas en una base de datos. Repasaremos los puntos clave:
- Para crear una relación entre las tablas, se indica la palabra clave
REFERENCES, el nombre de la tabla y la columna con la que se necesita la relación en la columna. - Una clave externa puede prevenir la eliminación de los datos si estos datos se refieren desde otras tablas.
- Con la palabra clave
ON DELETEpuedes configurar la eliminación en cascada, o la anotaciónNULLen los campos relacionados. - Al utilizar las claves externas, debes tener en cuenta la posibilidad de errores al insertar o eliminar datos. Por lo tanto, es importante pensar bien en la estructura de las relaciones entre las tablas y elegir las acciones adecuadas cuando se eliminen los datos relacionados (
CASCADE,SET NULLetc.).
Por lo tanto, el uso de claves primarias y externas en SQL no sólo ayuda a organizar la base de datos, sino que también garantiza la integridad y fiabilidad de los datos en ella.
Trabajo independiente
En el enlace puedes acceder a una base de datos con las tablas que se mencionaron en la teoría.
Experimenta con la estructura de la BD. Añade una eliminación en cascada para la tabla topics.
Materiales adicionales
Para acceder completo a curso necesitas un plan básico
El plan básico te dará acceso completo a todos los cursos, ejercicios y lecciones de Códica, proyectos y acceso de por vida a la teoría de las lecciones completadas. La suscripción se puede cancelar en cualquier momento.