Published on

February 5, 2020

Comprendiendo las claves foráneas en SQL Server

En este artículo, exploraremos el concepto de claves foráneas en SQL Server y entenderemos su importancia en el diseño de bases de datos y la integridad de los datos.

Introducción

Una clave foránea es una columna o conjunto de columnas que establece un vínculo referencial entre los datos de dos tablas. Nos permite mantener la integridad de los datos asegurando que los valores en la(s) columna(s) de clave foránea coincidan con los valores en la(s) columna(s) de clave primaria de la tabla referenciada. La tabla referenciada se conoce como tabla padre, mientras que la tabla que contiene la clave foránea se denomina tabla hija.

Las claves foráneas desempeñan un papel crucial en el mantenimiento de la consistencia de los datos y en la aplicación de relaciones entre tablas. Ayudan a prevenir la inserción de datos inválidos en la tabla hija al restringir los valores en la(s) columna(s) de clave foránea a aquellos presentes en la(s) columna(s) de clave primaria de la tabla padre.

Creación de una clave foránea

Consideremos un ejemplo en el que tenemos dos tablas: Clientes y PedidosDeCliente. La tabla Clientes almacena información detallada sobre los clientes, mientras que la tabla PedidosDeCliente almacena los detalles de los pedidos de los clientes. Para asegurarnos de que la tabla PedidosDeCliente solo contenga datos de clientes válidos, necesitamos crear una clave foránea entre las tablas Clientes y PedidosDeCliente.

Aquí tienes un ejemplo de cómo podemos crear la tabla Clientes y poblarla con algunos datos de muestra:

CREATE TABLE Clientes (
  ID INT PRIMARY KEY,
  NombreCliente VARCHAR(50),
  EdadCliente SMALLINT,
  PaisCliente VARCHAR(50)
)

INSERT INTO Clientes (ID, NombreCliente, EdadCliente, PaisCliente)
VALUES (1, 'Salvador', 23, 'Brasil'),
       (2, 'Lawrence', 60, 'China'),
       (3, 'Ernest', 38, 'India')

A continuación, podemos crear la tabla PedidosDeCliente con una clave foránea que hace referencia a la columna ID de la tabla Clientes:

CREATE TABLE PedidosDeCliente (
  ID INT PRIMARY KEY,
  FechaPedido DATETIME,
  IDCliente INT FOREIGN KEY REFERENCES Clientes(ID),
  Monto BIGINT
)

Ahora, cuando intentemos insertar una nueva fila en la tabla PedidosDeCliente, el valor de IDCliente debe coincidir con los valores en la columna ID de la tabla Clientes. Esto asegura que solo se inserten IDs de clientes válidos en la tabla PedidosDeCliente.

Restricciones de clave foránea

De forma predeterminada, SQL Server asigna automáticamente un nombre a la restricción de clave foránea. Sin embargo, si queremos dar un nombre específico a la restricción de clave foránea, podemos hacerlo utilizando la siguiente sintaxis:

CREATE TABLE PedidosDeCliente (
  ID INT PRIMARY KEY,
  FechaPedido DATETIME,
  IDCliente INT,
  Monto BIGINT,
  CONSTRAINT FK_ClienteCheck FOREIGN KEY (IDCliente) REFERENCES Clientes(ID)
)

También podemos agregar una clave foránea a una tabla existente utilizando la instrucción ALTER TABLE:

ALTER TABLE PedidosDeCliente
ADD CONSTRAINT FK_ClienteCheck FOREIGN KEY (IDCliente) REFERENCES Clientes(ID)

Para ver más detalles sobre las relaciones de clave foránea en la base de datos, podemos utilizar la siguiente consulta:

SELECT OBJECT_NAME(FK.referenced_object_id) AS 'Tabla Referenciada',
       OBJECT_NAME(FK.parent_object_id) AS 'Tabla Referente',
       FK.name AS 'Clave Foránea',
       COL_NAME(FK.referenced_object_id, FKC.referenced_column_id) AS 'Columna Referenciada',
       COL_NAME(FK.parent_object_id, FKC.parent_column_id) AS 'Columna Referente'
FROM sys.foreign_keys AS FK
INNER JOIN sys.foreign_key_columns AS FKC ON FKC.constraint_object_id = FK.OBJECT_ID

Reglas de actualización y eliminación de claves foráneas

Cuando actualizamos o eliminamos datos de la tabla padre, necesitamos especificar el comportamiento de los datos de la tabla hija, ya que están referenciados a la tabla padre. SQL Server nos permite definir reglas de actualización y eliminación para las claves foráneas para determinar el comportamiento de los datos de la tabla hija.

Las reglas de eliminación disponibles son:

  • No Action: Retorna un error al intentar eliminar una fila de la tabla padre. La instrucción de eliminación se revertirá.
  • Cascade: Elimina todas las filas asociadas de la tabla hija cuando se elimina una fila de la tabla padre.
  • Set Null: Actualiza los valores asociados en la tabla hija con nulos cuando se elimina una fila de la tabla padre. La columna de clave foránea debe ser nullable.
  • Set Default: Actualiza los valores asociados en la tabla hija con el valor predeterminado de la columna de clave foránea cuando se elimina una fila de la tabla padre. Se debe especificar una restricción predeterminada para la columna de clave foránea y el valor predeterminado debe coincidir en la tabla padre.

Las reglas de actualización disponibles son:

  • No Action: Retorna un error al intentar actualizar una fila en la tabla padre. La instrucción de actualización se revertirá.
  • Cascade: Actualiza todas las filas asociadas en la tabla hija cuando se actualiza una fila en la tabla padre.
  • Set Null: Actualiza los valores asociados en la tabla hija a un valor predeterminado cuando se actualiza una fila en la tabla padre. La columna de clave foránea debe ser nullable.
  • Set Default: Actualiza los valores asociados en la tabla hija con el valor predeterminado de la columna de clave foránea cuando se actualiza una fila en la tabla padre. Se debe especificar una restricción predeterminada para la columna de clave foránea y el valor predeterminado debe coincidir en la tabla padre.

Aquí tienes un ejemplo de creación de una tabla VentasCliente con una clave foránea que tiene una regla de eliminación de No Action y una regla de actualización de Set Null:

CREATE TABLE VentasCliente (
  ID INT PRIMARY KEY,
  FechaVenta DATETIME,
  IDCliente INT FOREIGN KEY REFERENCES Clientes(ID) ON UPDATE CASCADE ON DELETE NO ACTION,
  MontoVenta MONEY
)

INSERT INTO VentasCliente (ID, FechaVenta, IDCliente, MontoVenta)
VALUES (1, '05-Mar-2019', 1, 726.24),
       (2, '02-Nov-2019', 2, 817.33),
       (3, '13-Nov-2019', 3, 768.02)

Cuando intentemos eliminar una fila de la tabla Clientes, encontraremos un error debido a la regla de clave foránea que impide la eliminación del valor de la columna referenciada. De manera similar, actualizar una fila en la tabla Clientes afectará a las filas asociadas en la tabla VentasCliente, incluso si no se realizaron cambios directamente en la tabla VentasCliente.

Conclusión

En este artículo, hemos explorado el concepto de claves foráneas en SQL Server y su importancia en el mantenimiento de la integridad de los datos. Hemos aprendido cómo las claves foráneas establecen relaciones entre tablas y aplican la integridad referencial. Además, hemos visto cómo crear claves foráneas, especificar sus restricciones y definir reglas de actualización y eliminación. Comprender las claves foráneas es esencial para diseñar sistemas de bases de datos robustos y confiables.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.