Database
 sql >> Base de Dados >  >> RDS >> Database

Como criar uma tabela com várias chaves estrangeiras e não se confundir

Compreendendo as relações de tabela


O SQL Server adiciona chaves estrangeiras para implementar relações entre tabelas em um banco de dados relacional. Uma tabela pode ter relações um para um, um para muitos ou muitos para muitos com outra tabela, dependendo do tipo de dados que você deseja armazenar.

Um relacionamento um-para-um é simples e raramente usado. Cada registro em uma tabela específica está relacionado a exatamente um registro em outra tabela.

Por exemplo, você pode armazenar o nome, id e sexo do usuário em uma tabela (Usuário table) e seus endereços serão armazenados na tabela diferente (Endereço tabela). Cada registro no Usuário tabela corresponderá a um registro no Endereço tabela. Por outro lado, cada endereço no Endereço tabela pertencerá a apenas um registro no Usuário tabela.

As relações um-para-muitos e muitos-para-muitos são muito mais frequentes.

Considere um cenário em que você armazena informações sobre funcionários, departamentos, seguradoras de funcionários e endereços de escritórios de funcionários de uma organização.

Assumimos que um funcionário só pode pertencer a um único departamento e pode se inscrever em apenas uma companhia de seguros. No entanto, departamentos e companhias de seguros podem ter vários funcionários. O Departamento e Funcionário tabelas teriam um relacionamento um-para-muitos. Da mesma forma, o Seguro e tabelas de funcionários teria uma relação um-para-muitos.

Além disso, a organização pode ter vários escritórios e um funcionário pode trabalhar em mais de um escritório. Além disso, um escritório pode ter vários funcionários. Neste caso, o Escritório e Funcionário tabelas teriam um relacionamento muitos-para-muitos.

Para implementar o relacionamento muitos-para-muitos, você precisa criar uma tabela de consulta que conecte duas tabelas em um relacionamento muitos-para-muitos. As tabelas originais contêm um relacionamento um-para-muitos com a tabela de consulta.

Vamos considerar a criação de um relacionamento muitos-para-muitos entre o Funcionário e Escritório mesas. Você criaria uma nova tabela de pesquisa Employee_Office . Em seguida, você cria um relacionamento um-para-muitos entre o Funcionário e Employee_Office tabelas e o Escritório e Employee_Office mesas.

Vamos agora ver como as chaves estrangeiras se encaixam nessa discussão.

O que são chaves estrangeiras e por que você precisa de várias chaves estrangeiras?


Em bancos de dados relacionais, chaves estrangeiras implementam diferentes tipos de relacionamentos de banco de dados.

Por exemplo, para implementar um relacionamento um-para-muitos no SQL Server, você precisa adicionar uma chave estrangeira em uma tabela que está no muitos lados da relação um-para-muitos.

A chave estrangeira referencia a chave primária ou a chave de identidade única da tabela que está em um lado da mesa. Portanto, em um relacionamento um-para-muitos entre o Departamento e Funcionário tabelas que discutimos acima, o Funcionário A tabela armazenará uma chave estrangeira que faz referência à chave primária do Departamento tabela.

Em cenários em que uma tabela pode ter relacionamentos com várias outras tabelas, você precisará adicionar várias chaves estrangeiras a uma tabela. Para o Funcionário tabela, você precisa adicionar chaves estrangeiras que fazem referência às chaves primárias do Departamento mesa e o Seguro tabela. Da mesma forma, o Employee_Office A tabela de pesquisa terá duas chaves estrangeiras que fazem referência às chaves primárias do Employee e Escritório mesas.

Adicionar várias chaves estrangeiras com o SQL Server

O diagrama a seguir mostra o esquema de banco de dados que você implementará para nosso exemplo simples:

Aqui você pode ver que o banco de dados tem cinco tabelas:Employee , Seguros , Departamento , Escritório e Employee_Office .

O Departamento e Funcionário tabelas têm uma relação um-para-muitos. Da mesma forma, o Seguro e Funcionário tabelas também têm um relacionamento um-para-muitos. O Escritório e as tabelas Employee têm um relacionamento muitos para muitos implementado usando dois relacionamentos um para muitos com o Employee_Office tabela de pesquisa.

O Funcionário tabela tem duas chaves estrangeiras, Dep_Id e Insur_Id que se referem às chaves primárias (Id) do Departamento e Seguros tabelas, respectivamente.

Vamos agora executar o SQL Script que cria o banco de dados descrito.

Comece criando tabelas sem nenhuma chave estrangeira. Se você tentar criar tabelas com chaves estrangeiras que fazem referência a outras tabelas que ainda não foram criadas, você receberá um erro.

Em nosso esquema de banco de dados, o Departamento , Organização , e Escritório as tabelas não têm chaves estrangeiras. O script a seguir cria um banco de dados fictício chamado Organização e adiciona três tabelas:Departamento , Seguros , e Escritório .
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
)

Você pode usar as REFERÊNCIAS DE CHAVE ESTRANGEIRA restrição para implementar um relacionamento de chave estrangeira no SQL Server. Especifique o nome da tabela. Em seguida, especifique entre parênteses o nome da coluna da chave estrangeira para fazer referência a ela.

O script a seguir cria o Employee tabela com chaves estrangeiras Dep_Id e Insur_Id que fazem referência às colunas de ID no Departamento e Seguros tabelas 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)
)

Por fim, o script a seguir cria o Employee_Office tabela com duas chaves estrangeiras Emp_Id e 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)
)

Inserindo registros em tabelas com várias chaves estrangeiras


Para inserir registros em tabelas com várias chaves estrangeiras, você deve primeiro criar registros correspondentes nas tabelas referenciadas por chaves estrangeiras nas tabelas originais.

Na prática, para inserir registros no campo Funcionário tabela, devemos primeiro criar registros correspondentes no Departamento e Seguros mesas. É porque o Funcionário tabela contém chaves estrangeiras referenciando o Departamento e Seguros mesas.

Primeiro, tentamos adicionar registros ao Employee tabela sem especificar chaves estrangeiras referenciando o Departamento e Funcionário mesas.
INSERT INTO Employee
VALUES ('James', 10, 'Male'),
('Sara', 7, 'Female')

Você verá o seguinte erro. Isso ocorre porque o número de valores especificados não corresponde ao número de colunas no Employee tabela.

Vamos tentar adicionar alguns valores fictícios para o Dep_Id eInsur_Id colunas (chaves estrangeiras):
INSERT INTO Employee
VALUES ('James', 10, 'Male', 2, 2),
('Sara', 7, 'Female', 1, 1)

Você verá o seguinte erro, pois as tabelas Departamento e Seguros não possuem registros com IDs 2 e 1, respectivamente.

Vamos agora inserir registros no Departamento , Seguros , e Escritório tabelas:
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')

Uma vez que o Departamento e Seguros as tabelas agora têm registros com IDs 2 e 1, você pode inserir registros no Employee tabelas com valores de chave estrangeira correspondentes, conforme mostrado abaixo:
INSERT INTO Employee
VALUES ('James', 10, 'Male', 2, 2),
('Sara', 7, 'Female', 1, 1)

Insira alguns registros no Employee_Office tabela. Mas antes disso, vamos ver os valores da coluna Id na tabela Employee:
SELECT * FROM Employee

O Funcionário A coluna contém registros com valores de ID de 2 e 3. Você pode inserir registros no Employee_Office tabela onde o Emp_Id coluna contém 2 ou 3, e o Office_Id coluna contém 1 ou 2.
INSERT INTO Employee_Office
VALUES (2, 1),
(2, 2),
(3,2)

Selecionando registros de tabelas com várias chaves estrangeiras


Para selecionar registros de tabelas com várias chaves estrangeiras, você precisa de JOINs.

O script a seguir retorna valores do Nome e Gênero colunas do Funcionário tabela e o Nome colunas do Departamento e mesas de seguros. Uma vez que o Funcionário tabela contém duas chaves estrangeiras, você deve usar dois LEFT JOIN declarações:
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

Da mesma forma, você pode selecionar valores do Nome e Gênero colunas do Funcionário tabela e o Nome coluna do Escritório tabela usando duas instruções LEFT JOIN na tabela de pesquisa 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

EXCLUINDO registros de tabelas com várias chaves estrangeiras


Você pode excluir registros de tabelas com várias chaves estrangeiras. No entanto, certifique-se de que a tabela não seja referenciada por uma chave estrangeira em outra coluna.

Por exemplo, você não deve excluir registros do Departamento tabela referenciada pelo Emp_Id chave estrangeira no Funcionário tabela. Aqui está um exemplo:
DELETE FROM Department WHERE Id = 1

Desde o registro com ID 1 no Departamento tabela é referenciada pelo Emp_Id coluna na coluna Funcionário tabela, você não pode excluí-la conforme mencionado no erro acima. Primeiro, você deve excluir todos os registros do Funcionário tabela onde Emp_Id é 1.

A tabela Employee contém apenas 1 registro desse tipo (com o valor Id de 3). Vamos tentar excluir esse registro com a seguinte consulta:
DELETE FROM Employee WHERE Id = 3

Você verá o erro que ocorre porque Employee_Office contém um registro onde o Emp_Id coluna de chave estrangeira contém 3 registros. Portanto, você precisará remover esse registro primeiro:

O script a seguir remove o registro com o Emp_Id valor de 3 do Employee_Office tabela.
DELETE FROM Employee_Office WHERE Emp_Id = 3

Por fim, o script a seguir remove o registro com valores de Id de 1 do Employee e Departamento colunas.
DELETE FROM Employee WHERE Id = 1
DELETE FROM Department WHERE Id = 1

Conclusão


Assim, examinamos a adição de várias chaves estrangeiras em tabelas do SQL Server usando as consultas SQL para adicionar chaves estrangeiras. Espero que esses exemplos práticos usados ​​no artigo também tenham ajudado você a dominar esse tópico.

Quando você lida com chaves estrangeiras e dependências de tabela para executar as tarefas de trabalho, também é útil usar as ferramentas de software para simplificar as rotinas. Altamente recomendado é o Visual Database Diagram como uma solução dedicada para visualizar todas as dependências entre tabelas. Além disso, você pode gerar documentação precisa para todo o banco de dados, independentemente de sua complexidade, com o recurso Documentador de banco de dados.

Ambas as ferramentas visam reduzir a carga manual, automatizar os processos e acelerar o desempenho para tirar um pouco da carga de seus ombros.