sql >> Database >  >> RDS >> Database

Hoe maak je een tabel met meerdere buitenlandse sleutels en raak je niet in de war?

Inzicht in tabelrelaties

SQL-server voegt externe sleutels toe om relaties tussen tabellen in een relationele database te implementeren. Een tabel kan een-op-een, een-op-veel of veel-op-veel relaties hebben met een andere tabel, afhankelijk van het type gegevens dat u wilt opslaan.

Een één-op-één relatie is eenvoudig en wordt zelden gebruikt. Elk record in een bepaalde tabel heeft betrekking op precies één record in een andere tabel.

U kunt bijvoorbeeld de naam, het ID en het geslacht van de gebruiker in één tabel opslaan (Gebruiker tabel) en hun adressen worden opgeslagen in de andere tabel (Adres tafel). Elke record in de Gebruiker tabel komt overeen met één record in het Adres tafel. Omgekeerd, elk adres in het Adres tabel hoort bij slechts één record in de Gebruiker tafel.

Een-op-veel en veel-op-veel relaties komen veel vaker voor.

Overweeg een scenario waarin u informatie opslaat over de werknemers, afdelingen, verzekeringsmaatschappijen van werknemers en de kantooradressen van werknemers.

We gaan ervan uit dat een werknemer slechts tot één afdeling kan behoren en zich slechts bij één verzekeringsmaatschappij kan inschrijven. Afdelingen en verzekeringsmaatschappijen kunnen echter meerdere medewerkers hebben. De Afdeling en Werknemer tabellen zouden een een-op-veel-relatie hebben. Evenzo is de Verzekering en werknemerstafels een een-op-veel-relatie zou hebben.

Ook kan de organisatie meerdere kantoren hebben en kan een medewerker op meer dan één kantoor werken. Daarnaast kan een kantoor meerdere medewerkers hebben. In dit geval is het Kantoor en Werknemer tabellen zouden een veel-op-veel-relatie hebben.

Om de veel-op-veel-relatie te implementeren, moet u een opzoektabel maken die twee tabellen in een veel-op-veel-relatie met elkaar verbindt. De originele tabellen bevatten een een-op-veel-relatie met de opzoektabel.

Laten we eens kijken naar het creëren van een veel-op-veel-relatie tussen de Werknemer en Kantoor tafels. U zou een nieuwe opzoektabel maken Employee_Office . Vervolgens creëer je een één-op-veel relatie tussen de Medewerker en Employee_Office tabellen en het Kantoor en Employee_Office tabellen.

Laten we nu kijken hoe buitenlandse sleutels in deze discussie passen.

Wat zijn buitenlandse sleutels en waarom heeft u meerdere buitenlandse sleutels nodig?

In relationele databases implementeren externe sleutels verschillende soorten databaserelaties.

Als u bijvoorbeeld een een-op-veel-relatie in SQL Server wilt implementeren, moet u een externe sleutel toevoegen in een tabel die zich op de veel bevindt kanten van de een-op-veel-relatie.

De refererende sleutel verwijst naar de primaire sleutel of de unieke identiteitssleutel van de tabel die op één staat kant van de tafel. Vandaar dat in een een-op-veel-relatie tussen de Afdeling en Werknemer tabellen die we hierboven hebben besproken, de Werknemer tabel zal een externe sleutel opslaan die verwijst naar de primaire sleutel van de Afdeling tafel.

In scenario's waarin een tabel relaties kan hebben met meerdere andere tabellen, moet u meerdere externe sleutels aan een tabel toevoegen. Voor de Medewerker tabel, moet u externe sleutels toevoegen die verwijzen naar de primaire sleutels van de Afdeling tabel en de Verzekering tafel. Evenzo, de Employee_Office opzoektabel heeft twee externe sleutels die verwijzen naar de primaire sleutels van de Werknemer en Kantoor tabellen.

Meerdere externe sleutels toevoegen met SQL Server

Het volgende diagram toont het databaseschema dat u voor ons eenvoudige voorbeeld gaat implementeren:

Hier kunt u zien dat de database vijf tabellen heeft:Medewerker , Verzekering , Afdeling , Kantoor , en Employee_Office .

De Afdeling en Werknemer tabellen hebben een een-op-veel-relatie. Evenzo is de Verzekering en Werknemer tabellen hebben ook een een-op-veel-relatie. Het Kantoor en Werknemerstabellen hebben een veel-op-veel-relatie geïmplementeerd met behulp van twee een-op-veel-relaties met de Employee_Office opzoektabel.

De Medewerker tabel heeft twee externe sleutels, Dep_Id , en Insur_Id die verwijzen naar de primaire sleutels (Id) van de Afdeling en Verzekering tabellen, respectievelijk.

Laten we nu het SQL-script uitvoeren dat de beschreven database maakt.

Begin met het maken van tabellen zonder externe sleutels. Als u tabellen probeert te maken met externe sleutels die verwijzen naar andere tabellen die nog niet zijn gemaakt, krijgt u een foutmelding.

In ons databaseschema is de Afdeling , Organisatie , en Kantoor tabellen hebben geen externe sleutels. Het volgende script maakt een dummy-database met de naam Organisatie en voegt er drie tabellen aan toe:Afdeling , Verzekering , en Kantoor .

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
)

U kunt de BUITENLANDSE BELANGRIJKE REFERENTIES . gebruiken beperking om een ​​externe-sleutelrelatie in SQL Server te implementeren. Geef de tabelnaam op. Geef vervolgens tussen haakjes de kolomnaam op voor de externe sleutel om ernaar te verwijzen.

Het volgende script maakt de Werknemer tabel met externe sleutels Dep_Id en Insur_Id die verwijzen naar Id-kolommen in de Afdeling en Verzekering respectievelijk tabellen.

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)
)

Ten slotte maakt het volgende script de Employee_Office tabel met twee externe sleutels Emp_Id en 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)
)

Records invoegen in tabellen met meerdere externe sleutels

Als u records wilt invoegen in tabellen met meerdere externe sleutels, moet u eerst overeenkomstige records maken in de tabellen waarnaar wordt verwezen door externe sleutels in de originele tabellen.

In de praktijk, records invoegen in de Werknemer tabel, moeten we eerst corresponderende records maken in de Afdeling en Verzekering tafels. Het is omdat de Werknemer tabel bevat externe sleutels die verwijzen naar de Afdeling en Verzekering tabellen.

Eerst proberen we records toe te voegen aan de Werknemer tabel zonder externe sleutels op te geven die verwijzen naar de Afdeling en Werknemer tabellen.

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

U ziet de volgende fout. Het komt voor omdat het aantal opgegeven waarden niet overeenkomt met het aantal kolommen in de Werknemer tafel.

Laten we proberen enkele dummy-waarden toe te voegen voor de Dep_Id enInsur_Id kolommen (buitenlandse sleutels):

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

U ziet de volgende fout omdat de tabellen Afdeling en Verzekering geen records hebben met respectievelijk ID 2 en 1.

Laten we nu records invoegen in de Afdeling , Verzekering , en Kantoor tabellen:

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')

Sinds de Afdeling en Verzekering tabellen hebben nu records met id's 2 en 1, u kunt records invoegen in de Werknemer tabellen met bijbehorende buitenlandse sleutelwaarden zoals hieronder getoond:

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

Voeg enkele records in het Employee_Office in tafel. Maar laten we eerst eens kijken naar de Id-kolomwaarden in de Employee-tabel:

SELECT * FROM Employee

De Medewerker kolom bevat records met id-waarden 2 en 3. U kunt records invoegen in het Employee_Office tabel waar de Emp_Id kolom bevat 2 of 3, en de Office_Id kolom bevat 1 of 2.

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

Records selecteren uit tabellen met meerdere externe sleutels

Als u records wilt selecteren uit tabellen met meerdere externe sleutels, heeft u JOIN's nodig.

Het volgende script retourneert waarden van de Naam en Geslacht kolommen van de Werknemer tabel en de Naam kolommen van de Afdeling en Verzekeringstabellen. Sinds de Werknemer tabel twee externe sleutels bevat, moet u twee LEFT JOIN . gebruiken uitspraken:

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

Op dezelfde manier kunt u waarden selecteren van de Naam en Geslacht kolommen van de Werknemer tabel en de Naam kolom van het Kantoor tabel met twee LEFT JOIN-instructies in de opzoektabel 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

Verwijderen van records uit tabellen met meerdere externe sleutels

U kunt records verwijderen uit tabellen met meerdere refererende sleutels. Zorg er echter voor dat er niet naar de tabel wordt verwezen door een externe sleutel in een andere kolom.

U moet bijvoorbeeld geen records verwijderen van de Afdeling tabel waarnaar wordt verwezen door de Emp_Id externe sleutel in de Werknemer tafel. Hier is een voorbeeld:

DELETE FROM Department WHERE Id = 1

Sinds het record met ID 1 in de Afdeling naar de tabel wordt verwezen door de Emp_Id kolom in de Werknemer tabel, kunt u deze niet verwijderen zoals vermeld in de bovenstaande fout. Eerst moet u alle records van de Werknemer . verwijderen tabel waar Emp_Id is 1.

De tabel Werknemer bevat slechts 1 zo'n record (met de Id-waarde van 3). Laten we proberen die record te verwijderen met de volgende vraag:

DELETE FROM Employee WHERE Id = 3

U zult de fout zien die optreedt omdat Employee_Office bevat een record waar de Emp_Id kolom vreemde sleutel bevat 3 records. Daarom moet u dat record eerst verwijderen:

Het volgende script verwijdert de record met de Emp_Id waarde van 3 van de Employee_Office tafel.

DELETE FROM Employee_Office WHERE Emp_Id = 3

Ten slotte verwijdert het volgende script de record met Id-waarden van 1 uit de Employee en Afdeling kolommen.

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

Conclusie

Daarom hebben we het toevoegen van meerdere externe sleutels in SQL Server-tabellen onderzocht met behulp van de SQL-query's om externe sleutels toe te voegen. Ik hoop dat deze praktische voorbeelden die in het artikel worden gebruikt, u ook hebben geholpen om dit onderwerp onder de knie te krijgen.

Wanneer u omgaat met externe sleutels en tabelafhankelijkheden om de werktaken uit te voeren, is het ook handig om de softwaretools te gebruiken om de routines te vereenvoudigen. Sterk aanbevolen is het Visual Database Diagram als een speciale oplossing voor het bekijken van alle afhankelijkheden tussen tabellen. U kunt ook nauwkeurige documentatie voor de hele database genereren, ongeacht de complexiteit ervan, met de functie Database Documenter.

Beide tools zijn bedoeld om handmatige belasting te verminderen, de processen te automatiseren en de prestaties te versnellen om wat last van uw schouders te nemen.


  1. Semantisch zoeken gebruiken in SQL Server

  2. Hoeveel RAM heeft uw nieuwe databaseserver nodig?

  3. mysql fulltext zoeken mislukt

  4. Hoe 'ON DELETE CASCADE' toe te voegen in de ALTER TABLE-instructie