sql >> Base de Datos >  >> RDS >> Sqlserver

Crear una relación en SQL Server 2017

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)