sql >> Base de Datos >  >> RDS >> Database

RESTRICCIÓN DE CLAVE EXTERNA SQL:la guía definitiva y sencilla para novatos

novato? Entonces, una clave externa de SQL puede ser ajena a usted.

Es posible que haya escuchado diferentes opiniones sobre las claves externas de SQL. Si no lo has hecho, pronto lo harás. O su experiencia afectará su vista. Lo más importante que debe saber es que las claves externas son imprescindibles en las bases de datos relacionales.

Sin embargo, algunos desarrolladores pueden eliminar o ignorar las claves externas cuando se enfrentan a algunas complicaciones. ¿Entonces lo que hay que hacer? ¿Usar la clave foránea o no usarla? ¿Habrá momentos en los que no necesitará usarlos?

Esta guía es para que veas lo importante que es esto. También conocerá algunos errores en el código y aprenderá a solucionarlos. Además, por supuesto, usaremos ejemplos prácticos. No hay nada que no puedas manejar.

¿Qué es una clave externa de SQL?

Lo primero es lo primero. ¿Qué es la clave foránea en SQL? En pocas palabras, es una clave que une 2 tablas. Digamos que tiene una tabla principal y una tabla secundaria. Hay algo en común que los convierte en un padre y un hijo:la clave que relaciona estas 2 tablas.

Sin embargo, en las bases de datos SQL, una clave externa no solo se relaciona con las tablas. Hace cumplir la relación. Por eso se llama restricción de clave externa.

Se producirá un error si intenta agregar un registro secundario con un valor de clave externa que no existe en las claves principales de la tabla principal. Más tarde, veremos ejemplos de código que ilustran esto.

¿Qué tablas deberían tener restricciones de clave externa de SQL?

Las tablas secundarias pueden tener claves foráneas. Una clave externa puede estar haciendo referencia a otra tabla. Además, puede haber varias claves foráneas en una tabla "secundaria". En SQL Server, la clave externa puede hacer referencia a una clave principal o una clave única en otra tabla.

¿Qué hay de la autorreferencia?

Esto sale de la definición general de una clave externa. Una autoreferencia significa que puede asignar una clave externa que haga referencia una columna diferente en la misma tabla . SQL Server, MySQL y Oracle admiten esto.

La autorreferencia es aplicable cuando desea crear jerarquías como la relación gerente-personal. Está permitido, aún, la mayoría de las implementaciones de claves foráneas se encuentran entre 2 tablas.

Más adelante, tendremos ejemplos.

4 Beneficios de Usar Claves Foráneas SQL

Exploremos la clave principal y la clave externa en SQL en detalle. ¿Qué hace que las claves foráneas sean imprescindibles para una base de datos SQL? Examinemos 4 puntos (aquí, la sintaxis de restricción no importará).

1. Evite los datos "faltantes"

Los datos "faltantes" son valores de clave externa de tablas secundarias sin valores de clave principal asociados de la tabla principal. También se conocen como filas huérfanas. Cuando sucede, podemos decir que la base de datos tiene poca o ninguna integridad referencial.

Con las restricciones de clave externa aplicadas, los datos "faltantes" no ocurrirán en absoluto. El motor de la base de datos no permitirá la eliminación de un valor de clave principal al que hace referencia otra tabla. Del mismo modo, insertar una clave externa en la tabla secundaria que no existe en las claves principales de la tabla principal generará un error.

¿Qué es lo peor que puede pasar si no utiliza las restricciones de clave externa? Aquí hay algunos:

  • Los clientes no recibirán los productos por los que pagaron.
  • El tratamiento no se administra a los pacientes.
  • Las listas de verificación que faltan omiten las precauciones de seguridad.

Puede manejar estas cosas fuera de la base de datos, pero debe codificarlas. Más sobre esto seguirá.

Supongamos que un desarrollador de su organización manejó la misma restricción fuera de la base de datos. ¿Será responsable y solucionará el problema en producción si falla el código? No me parece. ¿Y si eres el administrador de la base de datos? Entonces, tendrás que limpiar su desorden. No tan alentador si me preguntas.

2. Evite informes inconsistentes

Se relaciona con el primer punto. Si "faltan" algunos datos, aparecen totales inconsistentes en diferentes informes. Los detalles no coinciden con los resúmenes. Las filas huérfanas se suman a los totales de los resúmenes. Mientras tanto, el informe detallado no capturó las filas huérfanas debido a una combinación interna de las tablas principales.

Si es su trabajo mantener su base de datos en buenas condiciones, también limpiará este desorden.

3. No se necesita código para evitar filas huérfanas

Las restricciones de clave externa actúan como agentes de autolimpieza. En lugar de limpiar el desorden, la base de datos lo hace al no permitir filas huérfanas. Las restricciones de clave externa también actúan como policía. Detienen la lógica defectuosa que causa las filas huérfanas y las tratan como un delito cometido fuera de la base de datos.

¿Quiere una base de datos brillante libre de filas huérfanas? Por supuesto que sí. Si desea analizar los datos algún día, se alegrará de haber utilizado claves externas. Esta base de datos será una buena fuente para copiar los datos necesarios en su área de preparación.

4. Comprenda rápidamente las relaciones entre tablas en un diagrama

SQL Server Management Studio tiene una herramienta de diagramación integrada para su base de datos. Las claves primarias y externas hacen que el diagrama de la base de datos sea informativo de un vistazo. Sin embargo, dependerá de cuántas tablas con relaciones hayas incluido en el diagrama.

Los diagramas ayudan a los nuevos miembros del equipo a comprender la estructura de datos. Para los compañeros de equipo senior, también puede ser útil como documentación.

Cuando la clave externa de SQL puede ser un "problema" (más la solución)

Para migrar datos antiguos a una nueva base de datos, insertará registros de forma masiva. Si la base de datos de origen tiene una integridad referencial baja, será complicado insertar registros desde el origen. La razón es que aparecen errores de clave externa aquí y allá.

¿Hay una solución? Tienes 2 opciones.

  1. Asegúrese de completar primero las tablas de referencia o las tablas principales. Después de eso, llene las tablas secundarias. Una complicación es correr muy lento. En otros casos, se producen más errores de restricción de clave externa. Si ocurre el último caso, debe volver a evaluar la secuencia de inserciones y asegurarse de que las claves principales se inserten primero. Si hay un problema de "funcionamiento lento", considere la siguiente opción.
  2. Desactive las claves foráneas temporalmente y habilítelas una vez finalizada (y limpiada) la migración. Puede hacerlo en SQL Server Management Studio o usar T-SQL ALTER TABLE. Sin embargo, es más fácil decirlo que hacerlo. En este punto, necesitas más paciencia además de tu ingenio y fuerza de voluntad. Más adelante, encontraremos la sintaxis para deshabilitar y volver a habilitar claves foráneas.

Otra cosa a considerar es usar una base de datos como área de preparación para OLAP o análisis de datos. Suponga que la base de datos transaccional de origen está limpia de filas huérfanas. O puede administrar para evitar estas filas a través del código. Entonces puede elegir no usar claves foráneas. Las claves foráneas ralentizarán las inserciones y actualizaciones masivas, especialmente en conjuntos de datos descomunales.

3 formas fáciles de agregar, editar y eliminar restricciones de clave externa de SQL

¿Qué se necesita para agregar, editar o eliminar claves externas? Es fácil con estos 3 consejos.

Los dos primeros pasos utilizan una interfaz gráfica de usuario. Herramientas como SQL Server Management Studio o dbForge Studio para SQL Server son muy buenas candidatas. El tercero usará código T-SQL. La elección de un código GUI o T-SQL depende de la situación.

1. Uso del Diseñador de tablas para agregar, editar y eliminar restricciones de clave externa de SQL

Es posible en SQL agregar restricciones de clave externa al crear o cambiar una estructura de tabla usando Diseñador de tablas en SSMS. La figura 1 a continuación muestra cómo acceder desde el menú principal cuando la estructura de la tabla está abierta.

Otra opción es hacer clic derecho en cualquier parte del diseñador de tablas y seleccionar Relaciones desde el menú contextual:

Una vez que haya seleccionado Relaciones , las Relaciones de clave externa aparecerá una ventana:

En las Relaciones de clave externa ventana, puede optar por agregar una nueva clave externa o editar/eliminar una existente.

Si elige agregar o editar, haga clic para expandir las Tablas y columnas Especificaciones. Luego haga clic en los puntos suspensivos botón para definir o editar las tablas de claves primarias y foráneas.

A partir de ahí, puede indicar las columnas de clave principal y externa.

Después de definir las claves principal y externa, haga clic en Aceptar . Luego navegue de regreso al diseñador de tablas y guarde los cambios.

2. Uso del diagrama de la base de datos para agregar, editar y eliminar restricciones de clave externa de SQL

Puede utilizar el Diagrama de base de datos para crear restricciones de clave externa de SQL. La Figura 5 muestra cómo crear una relación entre dos tablas haciendo clic en la tabla de clave externa y arrastrándola a la tabla de clave principal.

Cuando suelta el mouse, las Tablas y columnas Aparecerá una ventana como la de la Figura 4. Luego puede indicar las columnas de clave primaria y externa. Luego haga clic en Aceptar.

Para editar una relación existente, haga clic con el botón derecho en una relación en el diagrama. Luego seleccione Propiedades :

Luego, en las Propiedades ventana, expanda Tablas y columnas y haga clic en los puntos suspensivos botón:

Después de hacer clic en los puntos suspensivos el botón Tablas y columnas aparecerá la ventana. Puede cambiar las columnas de clave principal y externa (consulte la Figura 4 anterior nuevamente).

Mientras tanto, borrar una relación requiere hacer clic derecho en un existente relación. Seleccione Eliminar relaciones de la base de datos y haga clic en cuando se le solicite.

3. Uso de T-SQL para agregar, editar y eliminar restricciones de clave externa de SQL

La tercera forma de agregar una clave externa es a través del código T-SQL. Puede usar SQL CREATE TABLE y agregar la restricción de clave externa. O también puede usar ALTER TABLE para agregar esta restricción después de crear la tabla.

Esta es la sintaxis para usar CREATE TABLE:

-- Single-column foreign key
CREATE TABLE Table2
(ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
 col1 INT NULL REFERENCES Table1(col1)
)
GO

Después de definir el nombre y el tipo de columna, puede agregar REFERENCIAS a una tabla y columna. La sintaxis anterior muestra la Tabla1 tabla en la col1 columna. Tenga en cuenta que los nombres de las columnas en ambas tablas deben ser los mismos para que sean válidos para las claves foráneas.

La sintaxis anterior es para claves foráneas de una sola columna. Si necesita varias columnas como claves externas, use la cláusula FOREIGN KEY como se muestra a continuación:

-- Multiple-column foreign key
CREATE TABLE Table2
(ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
 col1 INT NOT NULL,
 col2 INT NOT NULL,
 col3 VARCHAR(10) NULL
 CONSTRAINT FK_Table1_Table2 FOREIGN KEY(col1, col2)
	REFERENCES Table1(col1,col2)
)
GO

Después de crear la tabla, puede agregar claves externas usando ALTER TABLE. Aquí está la sintaxis:

ALTER TABLE Table2 WITH CHECK ADD CONSTRAINT FK_Table1_Table2_2 FOREIGN KEY(col3)
	REFERENCES Table3(col1)
GO

Para eliminar una restricción de clave externa, puede usar ALTER TABLE con DROP CONSTRAINT:

ALTER TABLE Table2 
DROP CONSTRAINT FK_Table1_Table2_2
GO

Ahora, podemos resumir 3 formas de agregar, editar y eliminar claves foráneas:

Ejemplos de restricciones de clave externa de SQL (MySQL)

Tabla secundaria que tiene 1 referencia a una tabla principal

-- Single Reference
CREATE TABLE [dbo].[Countries](
	[CountryID] [int] IDENTITY(1,1) NOT NULL,
	[Country] [nvarchar](50) NOT NULL,
	[ContinentID] [int] NULL,
	[Modified] [datetime] NOT NULL,
 CONSTRAINT [PK_Country] PRIMARY KEY CLUSTERED 
(
	[CountryID] ASC
))
GO

ALTER TABLE [dbo].[Countries]  WITH CHECK ADD CONSTRAINT [FK_Countries_Continent] FOREIGN KEY([ContinentID])
REFERENCES [dbo].[Continent] ([ContinentID])

GO

ALTER TABLE [dbo].[Countries] CHECK CONSTRAINT [FK_Countries_Continent]
GO

Para visualizar esta relación, observe la Figura 9 a continuación:

El ContinentID es la clave que relaciona las dos tablas.

Tabla secundaria con varias referencias

El coche deportivo table tiene múltiples referencias a tres tablas diferentes:

-- Multiple References
CREATE TABLE [dbo].[SportsCars](
	[SportsCarID] [int] IDENTITY(1,1) NOT NULL,
	[ManufacturerID] [int] NULL,
	[StyleID] [int] NULL,
	[CountryID] [int] NULL,
	[Model] [nvarchar](50) NOT NULL,
	[Years] [varchar](50) NOT NULL,
	[Notes] [varchar](255) NOT NULL,
	[Modified] [datetime] NOT NULL,
 CONSTRAINT [PK_SportsCars] PRIMARY KEY CLUSTERED 
(
	[SportsCarID] ASC
))
GO

ALTER TABLE [dbo].[SportsCars] WITH CHECK ADD CONSTRAINT [FK_SportsCars_Country] FOREIGN KEY([CountryID])
REFERENCES [dbo].[Countries] ([CountryID])
GO

ALTER TABLE [dbo].[SportsCars] CHECK CONSTRAINT [FK_SportsCars_Country]
GO

ALTER TABLE [dbo].[SportsCars] WITH CHECK ADD CONSTRAINT [FK_SportsCars_Manufacturer] FOREIGN KEY([ManufacturerID])
REFERENCES [dbo].[Manufacturers] ([ManufacturerID])
GO

ALTER TABLE [dbo].[SportsCars] CHECK CONSTRAINT [FK_SportsCars_Manufacturer]
GO

ALTER TABLE [dbo].[SportsCars] WITH CHECK ADD CONSTRAINT [FK_SportsCars_Styles] FOREIGN KEY([StyleID])
REFERENCES [dbo].[Styles] ([StyleID])
GO

ALTER TABLE [dbo].[SportsCars] CHECK CONSTRAINT [FK_SportsCars_Styles]
GO

Así es como aparece en un diagrama de base de datos:

Autorreferencia

Las jerarquías de puestos muestran autorreferencia en la siguiente tabla:

CREATE TABLE [dbo].[Ranks](
	[RankId] [int] IDENTITY(1,1) NOT NULL,
	[Rank] [varchar](50) NOT NULL,
	[RankLevel] [smallint] NOT NULL,
	[RankParentId] [int] NULL,
 CONSTRAINT [PK_Ranks] PRIMARY KEY CLUSTERED 
(
	[RankId] ASC
)) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Ranks] WITH CHECK ADD CONSTRAINT [FK_Ranks_Ranks] FOREIGN KEY([RankParentId])
REFERENCES [dbo].[Ranks] ([RankId])
GO

ALTER TABLE [dbo].[Ranks] CHECK CONSTRAINT [FK_Ranks_Ranks]
GO

El diagrama de esta autorreferencia es simple. La línea apunta a la misma tabla en autorreferencia.

Con ON UPDATE y ON DELETE

Con ON UPDATE CASCADE, la actualización de un valor de columna de clave principal también actualizará los valores de clave externa en las tablas relacionadas. Mientras tanto, cuando usa ON DELETE CASCADE, al eliminar una clave principal también se eliminarán las claves externas. El valor predeterminado para ON UPDATE y ON DELETE es NO ACTION.

Aquí hay un ejemplo de ACTUALIZAR y ELIMINAR CASCADA:

ALTER TABLE [dbo].[Countries] WITH CHECK ADD CONSTRAINT [FK_Countries_Continent] FOREIGN KEY([ContinentID])
REFERENCES [dbo].[Continent] ([ContinentID]) 
ON UPDATE CASCADE 
ON DELETE CASCADE
GO

Deshabilitar una restricción de clave externa de SQL

Lo siguiente deshabilitará una restricción de clave externa existente. Tenga en cuenta que la relación aún existe.

ALTER TABLE [dbo].[SportsCars] NOCHECK CONSTRAINT [FK_SportsCars_Country]
GO

Este no es el valor predeterminado y no se recomienda. Pero para acelerar las inserciones y actualizaciones masivas, puede deshabilitar temporalmente la clave externa como la anterior. Una vez que haya terminado, debe volver a cambiarlo usando CHECK CONSTRAINT.

ALTER TABLE [dbo].[SportsCars] CHECK CONSTRAINT [FK_SportsCars_Country]
GO

Errores y correcciones

Esta sección le mostrará lo que sucede cuando INSERTAR, ACTUALIZAR o ELIMINAR registros con claves foráneas. Esto también supone que las claves foráneas no están deshabilitadas con RESTRICCIÓN NOCHECK. Esto te ayudará cuando te encuentres con estos problemas comunes.

En INSERTAR

-- This will cause an error because countryID = 47 does not exist in the Countries table
INSERT INTO SportsCars 
(ManufacturerID, StyleID, CountryID, Model, Years, Notes) 
VALUES (108, 10, 47, 'F2', '2021', 'Limited Edition')
GO

Este es el mensaje de error:

Msg 547, Level 16, State 0, Line 56
The INSERT statement conflicted with the FOREIGN KEY constraint "FK_SportsCars_Country". The conflict occurred in database "Vehicles", table "dbo.Countries", column 'CountryID'.
The statement has been terminated.

La solución :Agregar ID de país =47 en los Países mesa primero. Luego, vuelva a ejecutar la instrucción INSERT anterior. La secuencia comienza con la inserción de registros en la tabla principal y luego en la tabla secundaria.

En ACTUALIZAR

-- Update CountryID to 47 will trigger an error.
UPDATE SportsCars
SET CountryID = 47
WHERE ManufacturerID = 108
GO

Aquí está el error de ACTUALIZACIÓN:

Msg 547, Level 16, State 0, Line 60
The UPDATE statement conflicted with the FOREIGN KEY constraint "FK_SportsCars_Country". The conflict occurred in database "Vehicles", table "dbo.Countries", column 'CountryID'.
The statement has been terminated.

La solución :Agregar ID de país =47 en los Países mesa. Luego, vuelva a ejecutar la instrucción UPDATE.

En ELIMINAR

-- This will trigger an error because ManufacturerID = 108 is referenced in the SportsCars table
DELETE FROM Manufacturers
WHERE ManufacturerID = 108

Este código activará el error como se muestra a continuación:

Msg 547, Level 16, State 0, Line 64
The DELETE statement conflicted with the REFERENCE constraint "FK_SportsCars_Manufacturer". The conflict occurred in database "Vehicles", table "dbo.SportsCars", column 'ManufacturerID'.
The statement has been terminated.

La solución :Eliminar los registros correspondientes de los SportsCars tabla con FabricanteID =108. Luego, vuelva a ejecutar la instrucción DELETE anterior. Otra forma es habilitar ON DELETE CASCADE si corresponde. La secuencia comienza con la eliminación de registros de las tablas secundarias y, luego, de la tabla principal.

Puntos para llevar

Entonces, ¿las claves foráneas siguen siendo ajenas a ti?

Hagamos un resumen de lo que hemos aprendido hasta ahora.

  • Las claves foráneas vinculan dos tablas (o una tabla cuando se usa autorreferencia). Los necesita para garantizar la integridad referencial.
  • Puede usar una herramienta GUI o T-SQL para agregar, editar o eliminar las restricciones de clave externa.
  • Para las herramientas GUI, puede usar SQL Server Management Studio o dbForge Studio para SQL Server. Ambos ofrecen diagramas de bases de datos y diseñadores de tablas para crear tablas con claves primarias y externas.
  • CREATE TABLE y ALTER TABLE son adecuados para agregar y eliminar restricciones de clave externa.
  • Puede deshabilitar temporalmente las claves foráneas con NOCHECK CONSTRAINT en ALTER TABLE. Esto acelerará las inserciones y actualizaciones masivas. Pero asegúrese de volver a habilitarlo con CHECK CONSTRAINT.
  • Para evitar trampas con claves foráneas, asegúrese de seguir la secuencia correcta. Para INSERTAR y ACTUALIZAR, inserte primero en la tabla principal y luego en las tablas secundarias. Para ELIMINAR, primero elimine los registros secundarios y luego elimine los registros principales.

¿Le gustaría agregar algo para ayudar a los novatos a dominar las claves externas? Los Comentarios La sección está abierta para sus ideas brillantes. Si te gusta esta publicación, compártela en tus plataformas de redes sociales favoritas.