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

Cómo crear una tabla con múltiples claves foráneas y no confundirse

Comprensión de las relaciones entre tablas

El servidor SQL agrega claves externas para implementar relaciones entre tablas en una base de datos relacional. Una tabla puede tener relaciones de uno a uno, de uno a muchos o de muchos a muchos con otra tabla, según el tipo de datos que desee almacenar.

Una relación uno a uno es simple y rara vez se usa. Cada registro en una tabla en particular se relaciona exactamente con un registro en otra tabla.

Por ejemplo, puede almacenar el nombre, la identificación y el sexo del usuario en una tabla (Usuario tabla) y sus direcciones se almacenarán en la tabla diferente (Dirección mesa). Cada registro en el Usuario la tabla corresponderá a un registro en la Dirección mesa. Por el contrario, cada dirección en la Dirección la tabla pertenecerá a un solo registro en el Usuario mesa.

Las relaciones de uno a muchos y de muchos a muchos son mucho más frecuentes.

Considere un escenario en el que almacena información sobre los empleados, los departamentos, las compañías de seguros de los empleados y las direcciones de las oficinas de los empleados de una organización.

Suponemos que un empleado puede pertenecer a un solo departamento y puede suscribirse a una sola compañía de seguros. Sin embargo, los departamentos y las compañías de seguros pueden tener varios empleados. El Departamento y Empleado las tablas tendrían una relación de uno a muchos. Del mismo modo, el Seguro y Empleado tablas tendría una relación de uno a muchos.

Además, la organización puede tener varias oficinas y un empleado puede trabajar en más de una oficina. Además, una oficina puede tener varios empleados. En este caso, la Oficina y Empleado las tablas tendrían una relación de muchos a muchos.

Para implementar la relación de muchos a muchos, debe crear una tabla de búsqueda que conecte dos tablas en una relación de muchos a muchos. Las tablas originales contienen una relación de uno a varios con la tabla de búsqueda.

Consideremos crear una relación de muchos a muchos entre el Empleado y Oficina mesas. Crearía una nueva tabla de búsqueda Employee_Office . Luego crea una relación de uno a muchos entre el Empleado y Employee_Office mesas y la Oficina y Employee_Office mesas.

Veamos ahora cómo encajan las claves foráneas en esta discusión.

¿Qué son las claves externas y por qué necesita varias claves externas?

En las bases de datos relacionales, las claves foráneas implementan diferentes tipos de relaciones de bases de datos.

Por ejemplo, para implementar una relación de uno a varios en SQL Server, debe agregar una clave externa en una tabla que se encuentra en muchos lados de la relación de uno a muchos.

La clave externa hace referencia a la clave principal o la clave de identidad única de la tabla que se encuentra en uno lado de la mesa. Por lo tanto, en una relación de uno a muchos entre el Departamento y Empleado tablas que discutimos anteriormente, el Employee la tabla almacenará una clave externa que hace referencia a la clave principal del Departamento mesa.

En escenarios donde una tabla puede tener relaciones con varias otras tablas, deberá agregar varias claves externas a una tabla. Para el Empleado tabla, debe agregar claves externas que hagan referencia a las claves principales del Departamento tabla y el Seguro mesa. Del mismo modo, la Employee_Office la tabla de búsqueda tendrá dos claves externas que hacen referencia a las claves principales del Empleado y Oficina mesas.

Adición de varias claves foráneas con SQL Server

El siguiente diagrama muestra el esquema de base de datos que va a implementar para nuestro ejemplo simple:

Aquí puede ver que la base de datos tiene cinco tablas:Empleado , Seguros , Departamento , Oficina y Employee_Office .

El Departamento y Empleado Las tablas tienen una relación de uno a muchos. Del mismo modo, el Seguro y Empleado las tablas también tienen una relación de uno a muchos. La Oficina y las tablas de empleados tienen una relación de muchos a muchos implementada mediante dos relaciones de uno a muchos con Employee_Office tabla de búsqueda.

El Empleado la tabla tiene dos claves foráneas, Dep_Id y Id_seguro que se refieren a las claves primarias (Id) del Departamento y Seguros tablas, respectivamente.

Ahora ejecutemos el Script SQL que crea la base de datos descrita.

Comience creando tablas sin ninguna clave externa. Si intenta crear tablas con claves foráneas que hagan referencia a otras tablas que aún no se han creado, obtendrá un error.

En nuestro esquema de base de datos, el Departamento , Organización y Oficina las tablas no tienen claves foráneas. El siguiente script crea una base de datos ficticia llamada Organización y agrega tres tablas en él:Departamento , Seguros y Oficina .

CREATE DATABASE Organization

USE Organization
CREATE TABLE Department
(
Id INT PRIMARY KEY,
Name VARCHAR (50) NOT NULL
)

USE Organization
CREATE TABLE Insurance
(
Id INT PRIMARY KEY,
Name VARCHAR (50) NOT NULL
)

USE Organization
CREATE TABLE Office
(
Id INT PRIMARY KEY,
Name VARCHAR (50) NOT NULL
)

Puede utilizar las REFERENCIAS DE CLAVE EXTRANJERA restricción para implementar una relación de clave externa en SQL Server. Especifique el nombre de la tabla. A continuación, especifique entre paréntesis el nombre de la columna de la clave externa para hacer referencia a ella.

El siguiente script crea el Empleado tabla con claves foráneas Dep_Id y Id_seguro que hacen referencia a columnas de ID en el Departamento y Seguros tablas respectivamente.

USE Organization
CREATE TABLE Employee
(
Id INT PRIMARY KEY IDENTITY(1,1),
Name VARCHAR (50) NOT NULL,
Age INT,
Gender VARCHAR (50),
Dep_Id int FOREIGN KEY REFERENCES Department(Id),
Insur_Id int FOREIGN KEY REFERENCES Insurance(Id)
)

Finalmente, el siguiente script crea la Employee_Office tabla con dos claves foráneas Emp_Id y Office_Id .

USE Organization
CREATE TABLE Employee_Office
(
Id INT PRIMARY KEY IDENTITY(1,1),
Emp_Id int FOREIGN KEY REFERENCES Employee(Id),
Office_Id int FOREIGN KEY REFERENCES Office(Id)
)

Inserción de registros en tablas con varias claves foráneas

Para insertar registros en tablas con varias claves foráneas, primero debe crear los registros correspondientes en las tablas a las que hacen referencia las claves foráneas en las tablas originales.

En la práctica, para insertar registros en el Empleado tabla, primero debemos crear los registros correspondientes en el Departamento y Seguros mesas. Es porque el Empleado la tabla contiene claves foráneas que hacen referencia al Departamento y Seguros mesas.

Primero, tratamos de agregar registros en el Empleado tabla sin especificar claves foráneas que hagan referencia al Departamento y Empleado mesas.

INSERT INTO Employee
VALUES ('James', 10, 'Male'),
('Sara', 7, 'Female')

Verá el siguiente error. Ocurre porque la cantidad de valores especificados no coincide con la cantidad de columnas en el Empleado mesa.

Intentemos agregar algunos valores ficticios para el Dep_Id y Id_seguro columnas (claves foráneas):

INSERT INTO Employee
VALUES ('James', 10, 'Male', 2, 2),
('Sara', 7, 'Female', 1, 1)

Verá el siguiente error ya que las tablas Departamento y Seguro no tienen registros con los ID 2 y 1, respectivamente.

Ahora insertemos registros en el Departamento , Seguros y Oficina tablas:

INSERT INTO Department
VALUES (1, 'Finance'),
(2, 'HR')

INSERT INTO Insurance
VALUES (1, 'Company A'),
(2, 'Company B')

INSERT INTO Office
VALUES (1, 'Paris'),
(2, 'London')

Desde el Departamento y Seguros las tablas ahora tienen registros con los Id. 2 y 1, puede insertar registros en el Empleado tablas con los valores de clave foránea correspondientes, como se muestra a continuación:

INSERT INTO Employee
VALUES ('James', 10, 'Male', 2, 2),
('Sara', 7, 'Female', 1, 1)

Inserte algunos registros en la Employee_Office mesa. Pero antes de eso, veamos los valores de la columna Id en la tabla Empleado:

SELECT * FROM Employee

El Empleado La columna contiene registros con valores de ID de 2 y 3. Puede insertar registros en la Employee_Office tabla donde el Emp_Id columna contiene 2 o 3, y el Office_Id la columna contiene 1 o 2.

INSERT INTO Employee_Office
VALUES (2, 1),
(2, 2),
(3,2)

Seleccionar registros de tablas con varias claves foráneas

Para seleccionar registros de tablas con claves foráneas múltiples, necesita JOIN.

El siguiente script devuelve valores del Nombre y Género columnas del Empleado tabla y el Nombre columnas del Departamento y tablas de seguros. Dado que el Empleado la tabla contiene dos claves foráneas, debe usar dos LEFT JOIN declaraciones:

SELECT 
Employee.Name AS Employee_Name, 
Employee.Gender, 
Department.Name as Department_Name, 
Insurance.Name as Insurance

FROM Employee
LEFT JOIN Department ON Employee.Dep_Id  =  Department.Id
LEFT JOIN Insurance  ON Employee.Insur_Id = Insurance.Id

De la misma manera, puede seleccionar valores del Nombre y Género columnas del Empleado tabla y el Nombre columna de la Oficina usando dos declaraciones LEFT JOIN en la tabla de búsqueda Employee_Office .

SELECT 
Employee.Name AS Employee_Name, 
Employee.Gender, 
Office.Name as Office_Name

FROM Employee
LEFT JOIN Employee_Office ON Employee.Id  =  Employee_Office.Emp_Id
LEFT JOIN Office  ON Office.Id = Employee_Office.Office_Id

ELIMINACIÓN de registros de tablas con varias claves foráneas

Puede eliminar registros de tablas con varias claves externas. Sin embargo, asegúrese de que la tabla no esté referenciada por una clave externa en otra columna.

Por ejemplo, no debe eliminar registros del Departamento tabla a la que hace referencia el Emp_Id clave foránea en el Empleado mesa. Aquí hay un ejemplo:

DELETE FROM Department WHERE Id = 1

Desde el registro con Id 1 en el Departamento la tabla está referenciada por el Emp_Id columna en el Empleado tabla, no puede eliminarla como se menciona en el error anterior. Primero, debe eliminar todos los registros del Empleado tabla donde Emp_Id es 1.

La tabla Empleado contiene solo 1 registro de este tipo (con el valor de Id de 3). Intentemos eliminar ese registro con la siguiente consulta:

DELETE FROM Employee WHERE Id = 3

Verá el error que ocurre porque Employee_Office contiene un registro donde el Emp_Id La columna de clave externa contiene 3 registros. Por lo tanto, primero deberá eliminar ese registro:

El siguiente script elimina el registro con el Emp_Id valor de 3 de la Employee_Office mesa.

DELETE FROM Employee_Office WHERE Emp_Id = 3

Finalmente, la siguiente secuencia de comandos elimina el registro con valores de Id de 1 del Empleado y Departamento columnas.

DELETE FROM Employee WHERE Id = 1
DELETE FROM Department WHERE Id = 1

Conclusión

Por lo tanto, hemos examinado la adición de varias claves foráneas en las tablas de SQL Server utilizando las consultas SQL para agregar claves foráneas. Espero que estos ejemplos prácticos utilizados en el artículo también te hayan ayudado a dominar este tema.

Cuando se trata de claves foráneas y dependencias de tablas para realizar las tareas de trabajo, también es útil utilizar las herramientas de software para simplificar las rutinas. Se recomienda encarecidamente Visual Database Diagram como una solución dedicada para ver todas las dependencias entre tablas. Además, puede generar documentación precisa para toda la base de datos, sin importar su complejidad, con la función Documentador de base de datos.

Ambas herramientas tienen como objetivo reducir la carga manual, automatizar los procesos y acelerar el rendimiento para quitarle algo de carga.