Una de las características clave de las bases de datos relacionales es la capacidad de enlazar datos almacenados en diferentes tablas. Estos enlaces, llamados referencias, actúan esencialmente como conexiones entre tablas. En este artículo, aprenderemos qué hace la restricción FOREIGN KEY en SQL. Explicaré cómo definirla utilizando la sentencia CREATE TABLE y veremos algunos ejemplos. A continuación, hablaremos de sus ventajas y características.
¿Qué es una Clave Primaria y su Propósito?
Para eso vamos a ubicarnos en la primera tabla que ya utilizamos, que es Usuarios. Ahora vamos a dar clic derecho y seleccionamos Diseño y en este momento podemos ver la tabla como ya la tenemos definida con cuatro columnas. Tenemos que tomar una decisión: ¿quién va a ser la llave primaria? En realidad, la llave primaria es el dato más importante que vamos a tener en la tabla y que, en principio, nos va a ayudar a identificar los elementos que tenemos. Por ejemplo, en la vida real como decíamos, los carros tienen placas, las personas tienen ID, identificadores, los estudiantes tienen matrículas, por ejemplo, y así todo tiene algo que lo identifica y tiene un elemento único.
Para un valor del campo clave existe solamente 1 registro. Al ingresar los registros, SQL Server controla que los valores para los campos establecidos como clave primaria no estén repetidos en la tabla; si estuviesen repetidos, muestra un mensaje y la inserción no se realiza. Todas las columnas definidas en una restricción PRIMARY KEY se deben definir como NOT NULL. Puede definir una clave principal en el Motor de base de datos de SQL Server mediante SQL Server Management Studio o Transact-SQL. Al crear una clave principal, se crea automáticamente un índice clúster único correspondiente. En el Diseñador de tablas, haga clic en el selector de filas de la columna de base de datos que desea definir como clave principal. Si desea volver a definir la clave principal, debe eliminar las relaciones establecidas con la clave principal existente antes de crear una nueva.
Claves Primarias Compuestas
Una clave primaria no siempre tiene que ser una sola columna. Si define una clave compuesta, el orden de las columnas de la clave principal coincide con el de las columnas mostradas en la tabla. Sin embargo, puede cambiar el orden de las columnas después de crear la clave principal. Por ejemplo, no podemos usar solamente la patente porque un mismo auto puede ingresar más de una vez en el día a la playa; tampoco podemos usar la hora de entrada porque varios autos pueden ingresar a una misma hora. En este caso, la combinación de varias columnas formaría una clave única.
¿Qué es una Clave Foránea?
Para entender el concepto de la restricción FOREIGN KEY en SQL, puede pensar en ella como un enlace de referencia entre las tablas que se conocen como primaria (o padre) y extranjera (o hija). La tabla externa hace referencia a una o más columnas (la clave primaria, que puede ser una o más columnas) en la tabla primaria; así es como se crea el enlace. Creo que algunas ayudas visuales pueden ser útiles aquí. Aquí, tenemos la tabla Airplane (la tabla primaria) y la tabla Flight (la tabla externa). La columna AirplaneId, que es una columna de clave primaria para la tabla Airplane, se utiliza como columna de clave externa en la tabla Flight tabla.
Lea también: IVA 21% Excel
Los valores contenidos en la columna Flight.AirplaneId se refieren directamente a los valores contenidos en la columna Airplane.AirplaneId. Si se especifica un valor distinto de NULL en la columna de una restricción FOREIGN KEY, el valor debe existir en la columna a la que se hace referencia. De lo contrario, se devuelve un mensaje de error por violación de clave externa. Una restricción de clave externa no tiene que estar vinculada solo a una restricción de clave principal en otra tabla. Las restricciones FOREIGN KEY solo pueden hacer referencia a las tablas de la misma base de datos en el mismo servidor. La integridad referencial entre bases de datos debe implementarse a través de desencadenadores.
Declaración de Claves Foráneas Compuestas
Una restricción FOREIGN KEY especificada en el nivel de columna solo puede incluir una columna de referencia. Sin embargo, una restricción FOREIGN KEY especificada en el nivel de tabla debe tener el mismo número de columnas de referencia que la lista de columnas de la restricción. Esto es fundamental cuando se referencia una clave primaria compuesta en la tabla primaria. Ahora queremos llevar nuestro diseño a la base de datos. Aquí, además de la restricción PRIMARY KEY, hemos definido la restricción FOREIGN KEY. Le hemos dado el nombre de FK_AirplaneId. Entre paréntesis, definimos la columna de la tabla Flight que implementa la restricción FOREIGN KEY. Puede ocurrir que queramos añadir la restricción FOREIGN KEY a la tabla Flight después de haber creado la tabla. También es posible que queramos eliminar una restricción de FOREIGN KEY. Supongamos que queremos cambiar la restricción FOREIGN KEY definida anteriormente por su versión multicolumna.
Ventajas y Gestión de Claves Foráneas
La primera ventaja de la restricción FOREIGN KEY es que garantiza la existencia de la fila referenciada en la tabla primaria. Otra ventaja de la restricción FOREIGN KEY (FK) es que garantiza la corrección de la referencia incluso cuando se modifican o eliminan los valores de la tabla primaria. Hay una variedad de acciones que indican qué hacer en la actualización o eliminación de una fila de clave primaria (PK). Veamos cada una de ellas.
Acciones de Integridad Referencial
| Acción | ON DELETE | ON UPDATE |
|---|---|---|
| RESTRICT | No permite la eliminación de filas de clave primaria en la tabla primaria. | (Ver NO ACTION) |
| SET NULL | Permite la eliminación de filas en la tabla primaria pero no se quiere que se propague a la tabla externa, estableciendo los valores de clave externa en NULL. | Permite modificar la PK de la tabla primaria, estableciendo los valores de clave externa en NULL. |
| SET DEFAULT | Permite la eliminación de filas en la tabla primaria, estableciendo los valores de clave externa en su valor por defecto. | Permite modificar la PK de la tabla primaria. Como resultado, los valores de la clave externa se establecen en su valor por defecto. |
| CASCADE | (No detallado directamente para DELETE en el texto.) | Permite modificar los valores de la(s) columna(s) PK de la tabla primaria, propagando los cambios a las claves foráneas. |
| NO ACTION | (No detallado directamente para DELETE en el texto.) | Es similar a la opción ON UPDATE RESTRICT. La diferencia es que algunas bases de datos permiten posponer las comprobaciones de las acciones hasta después de la transacción con ON UPDATE NO ACTION. |
Las acciones que ofrece la restricción FOREIGN KEY sobre la actualización realizada en la tabla primaria son similares a las acciones sobre la eliminación. La opción ON UPDATE CASCADE permite modificar los valores de la(s) columna(s) PK de la tabla primaria. Esta opción permite modificar la(s) columna(s) de la clave primaria de la tabla primaria. La opción ON UPDATE NO ACTION es similar a la opción ON UPDATE RESTRICT. La opción ON UPDATE SET NULL permite modificar la PK de la tabla primaria. La opción ON UPDATE SET DEFAULT permite modificar la PK de la tabla primaria.
Cardinalidad y Límites
Otra característica que ofrece la restricción FOREIGN KEY es su cardinalidad. Al establecer la cardinalidad, podemos decidir cómo se relacionan la(s) columna(s) de clave foránea con la(s) columna(s) de clave primaria. Para implementar la relación uno a uno, debemos declarar la(s) columna(s) de clave externa como UNIQUE.
Lea también: Guía IVA reducido
El motor de base de datos no tiene un límite predefinido para el número de restricciones FOREIGN KEY que puede contener una tabla y que hacen referencia a otras tablas. El motor de base de datos tampoco limita el número de restricciones FOREIGN KEY que pertenecen a otras tablas y que hacen referencia a una tabla concreta. No obstante, el número real de restricciones FOREIGN KEY utilizadas está limitado por la configuración del hardware y por el diseño de la base de datos y de la aplicación. Una tabla puede hacer referencia a otras 253 tablas y columnas como claves externas (referencias de salida) como máximo. SQL Server 2016 (13.x) y versiones posteriores aumentan el límite para la cantidad de otras tablas y columnas que pueden hacer referencia a las columnas de una sola tabla (referencias de entrada) de 253 a 10 000 (Requiere al menos el nivel de compatibilidad 130). Se admiten más de 253 referencias de clave externa para las operaciones DELETE y UPDATE DML. Si la clave externa se define en una columna de tipo definido por el usuario CLR, la implementación del tipo debe admitir el orden binario.
Métodos de Declaración
En este artículo se describe cómo crear relaciones de clave externa en SQL Server mediante SQL Server Management Studio o Transact-SQL. En el menú Diseñador de tablas, seleccione Relaciones. La relación aparece en la lista Relación seleccionada con un nombre proporcionado por el sistema en el formato FK_<tablename>_<tablename>, donde el primer nombre de tabla es el nombre de la tabla de claves externas y el segundo nombre de tabla es el nombre de la tabla de claves principales. En la cuadrícula situada debajo del cuadro de diálogo, elija las columnas que contribuyen a la clave principal de la tabla. El Diseñador de tablas sugerirá un nombre para la relación. En el ejemplo siguiente se crea una tabla y se define una restricción de clave externa en la columna TempID que hace referencia a la columna SalesReasonID de la tabla Sales.SalesReason en la base de datos AdventureWorks. El ejemplo siguiente se crea una tabla en la base de datos AdventureWorks2025 con una clave principal no agrupada en la columna CustomerID.
Lea también: ¿Cómo localizar tus XML del SAT?
