Regístrate para acceder a más de 15 cursos gratuitos de programación con un simulador

Claves externas Diseño de bases de datos

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 temas un registro con un valor usuario_id que no se encuentra en la tabla usuarios, 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 usuarios que tiene referencias en la tabla temas, se producirá un error

    DELETE 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 DELETE puedes configurar la eliminación en cascada, o la anotación NULL en 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 NULL etc.).

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

  1. Restricciones / PostgreSQL (en inglés)

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.

Obtener acceso
130
cursos
1000
ejercicios
2000+
horas de teoría
3200
test

Obtén acceso

Cursos de programación para principiantes y desarrolladores experimentados. Comienza tu aprendizaje de forma gratuita

  • 130 cursos, 2000+ horas de teoría
  • 1000 ejercicios prácticos en el navegador
  • 360 000 estudiantes
Al enviar el formulario, aceptas el «Política de privacidad» y los términos de la «Oferta», y también aceptas los «Términos y condiciones de uso»

Nuestros graduados trabajan en empresas como:

Bookmate
Health Samurai
Dualboot
ABBYY