Aprenda a crear una relación entre dos tablas en SQL Server.
En el diseño de bases de datos relacionales, una relación es donde dos o más tablas están vinculadas porque contienen datos relacionados. Esto permite a los usuarios realizar consultas de datos relacionados en varias tablas.
Esta parte del tutorial explica cómo crear las siguientes relaciones:
Hay dos relaciones en ese diagrama. Existe una relación entre los Albums
y Artists
tablas, y hay otra relación entre los Albums
y Genres
mesas.
Al mirar ese diagrama, podemos ver que un artista podría tener muchos álbumes. En este caso, solo necesitamos tener una fila que contenga el nombre del artista, independientemente de cuántos álbumes tenga. Esto se debe a que podemos crear un registro en Artists
tabla con un ArtistId
único . Todos los álbumes de ese artista residirán en Albums
y contendrán el mismo ID de artista en su propio ArtistId
columna. Al hacer esto, podemos ejecutar una consulta en ambas tablas y devolver el nombre del artista, además de todos los álbumes que ha lanzado. Este es el beneficio de las relaciones.
Anteriormente creamos una base de datos que contenía las tres tablas anteriores. Cuando hicimos eso, también creamos una de las relaciones representadas en el diagrama anterior. Creamos la relación entre los Albums
tabla y los Artists
tabla (donde el ArtistId
columna de los Albums
la tabla hace referencia al ArtistsId
columna de los Artists
tabla).
Este es el código que ejecutamos para crear las tablas:
El código resaltado es la parte que crea una relación entre los Albums
tabla y los Artists
mesa. Lo hace configurando el ArtistId
columna de los Albums
para hacer referencia al ArtistId
columna de los Artists
mesa.
Una forma más técnica de decir esto es que Albums.ArtistId
se convierte en una clave foránea de Artists.ArtistId
(que en sí mismo es la clave principal de esa tabla). Esta es una restricción de clave externa.
¿Qué es una restricción de clave externa?
Una restricción de clave externa define una relación entre esta tabla y otra tabla. Cuando crea una restricción de clave externa, la crea contra una columna específica en el hijo tabla, para hacer referencia a una columna específica en parent mesa.
Esto hace que esa columna en la tabla secundaria sea una clave externa . La restricción garantiza que cualquier valor que entre en esta columna (clave externa) se corresponda con un valor en la columna de clave principal de la tabla principal. Si alguien intenta ingresar un valor que no se corresponde con un valor en la columna de clave principal de la tabla principal, SQL Server generará un error.
Esto ayuda a reforzar la integridad referencial. Nos impide tener registros huérfanos (registros secundarios que no tienen padre). O en nuestro ejemplo, álbumes que no están asociados con ningún artista.
Si usa una herramienta de administración de base de datos GUI como SSMS o Azure Data Studio, la relación aparecerá debajo de Keys
nodo para la tabla con la clave foránea:
Vamos a deconstruir el código:
CONSTRAINT FK_Albums_Artists FOREIGN KEY (ArtistId) REFERENCES dbo.Artists (ArtistId) ON DELETE NO ACTION ON UPDATE NO ACTION
Las dos primeras líneas crean la relación. Crean una restricción de clave externa entre
Albums.ArtistId
columna y
Artists.ArtistId
columna. En este caso llamamos a la restricción de clave foránea FK_Albums_Artists
.
Las dos últimas líneas especifican qué debe hacer SQL Server si alguien intenta eliminar o actualizar un registro principal al que hace referencia un registro en la tabla secundaria. En este caso, NO ACTION
significa que la eliminación/actualización no continuará. El usuario simplemente recibirá un error.
Puede cambiar esto a ON DELETE CASCADE
si desea poder eliminar el padre y el hijo de una sola vez (es decir, la eliminación se realizará en cascada del padre al hijo). La misma lógica se aplica a las actualizaciones, usando ON UPDATE CASADE
.
NO ACTION
es el valor predeterminado, por lo que podríamos haberlo hecho sin esas dos últimas líneas de código. Sin embargo, lo incluí porque es un factor importante a tener en cuenta al crear restricciones de clave externa.
Agregar una relación a una tabla existente
El ejemplo anterior crea una relación al mismo tiempo que se crean las tablas. Sin embargo, puede haber ocasiones en las que necesite agregar una relación a una tabla existente.
Agreguemos una nueva relación entre los Genres
y Albums
mesas.
Ejecute el siguiente código:
USE Music; ALTER TABLE Albums ADD CONSTRAINT FK_Albums_Genres FOREIGN KEY (GenreId) REFERENCES dbo.Genres (GenreId) ON DELETE NO ACTION ON UPDATE NO ACTION ;
Esto crea una nueva clave externa en los Albums
mesa. Da como resultado Albums.GenreId
convirtiéndose en una clave externa que hace referencia a Genres.GenreId
.
Entonces, ejecutar esa declaración da como resultado que se muestre una nueva clave externa debajo de las Claves nodo:
Claves foráneas de una sola columna
Las claves foráneas de una sola columna (como la de arriba) también se pueden especificar en el nivel de columna. Así que otra forma de crear los Albums
table y su clave foránea es así:
CREATE TABLE Albums ( AlbumId int IDENTITY(1,1) NOT NULL PRIMARY KEY, AlbumName nvarchar(255) NOT NULL, ReleaseDate date NOT NULL, ArtistId int NOT NULL REFERENCES Artists(ArtistId), GenreId int NOT NULL );
Este método no se puede utilizar en restricciones de clave de varias columnas, por lo que, para ello, utilice la sintaxis del ejemplo original anterior.
Claves foráneas multicolumna
Una clave externa de varias columnas es donde se usa más de una columna para la clave externa. Esto se usa normalmente cuando la tabla principal usa varias columnas para su clave principal. Este podría ser el caso si la tabla principal combina los valores de dos columnas para crear un valor único.
Las claves foráneas de varias columnas se pueden crear utilizando la sintaxis del ejemplo original anterior. Simplemente agregue cada nombre de columna separado por una coma.
Entonces, si imaginamos que los Albums
la tabla también tiene un ArtistName
columna (y que los Artists
la tabla usa ArtistId
y ArtistName
como clave principal), una clave externa de varias columnas se vería así:
CONSTRAINT FK_Albums_Artists FOREIGN KEY (ArtistId, ArtistName) REFERENCES dbo.Artists (ArtistId, ArtistName)