Forstå tabelrelationer
SQL-server tilføjer fremmednøgler for at implementere relationer mellem tabeller i en relationsdatabase. En tabel kan have en-til-en-, en-til-mange- eller mange-til-mange-relationer med en anden tabel, afhængigt af den type data, du vil gemme.
Et en-til-en forhold er enkelt og sjældent brugt. Hver post i en bestemt tabel relaterer sig til præcis én post i en anden tabel.
For eksempel kan du gemme brugerens navn, id og køn i én tabel (Bruger tabel), og deres adresser vil blive gemt i den anden tabel (Adresse bord). Hver post i Bruger tabel vil svare til én post i Adressen bord. Omvendt er hver adresse i Adressen tabel vil kun tilhøre én post i Bruger tabel.
En-til-mange og mange-til-mange relationer er langt hyppigere.
Overvej et scenarie, hvor du gemmer oplysninger om en organisations ansatte, afdelinger, ansattes forsikringsselskaber og ansattes kontoradresser.
Vi antager, at en medarbejder kun kan tilhøre en enkelt afdeling og kun kan tegne et forsikringsselskab. Afdelinger og forsikringsselskaber kan dog have flere ansatte. Afdelingen og medarbejder tabeller ville have et en-til-mange forhold. Tilsvarende er Forsikringen og medarbejderborde ville have et en-til-mange forhold.
Organisationen kan også have flere kontorer, og en medarbejder kan arbejde på mere end ét kontor. Desuden kan et kontor have flere ansatte. I dette tilfælde er Office og medarbejder tabeller ville have et mange-til-mange forhold.
For at implementere mange-til-mange-relationen skal du oprette en opslagstabel, der forbinder to tabeller i en mange-til-mange-relation. De originale tabeller indeholder et en-til-mange forhold til opslagstabellen.
Lad os overveje at skabe et mange-til-mange-forhold mellem medarbejderen og Kontor tabeller. Du ville oprette en ny opslagstabel Employee_Office . Derefter opretter du en en-til-mange-relation mellem medarbejderen og Employee_Office tabeller og kontoret og Employee_Office tabeller.
Lad os nu se, hvordan fremmednøgler passer ind i denne diskussion.
Hvad er fremmednøgler, og hvorfor har du brug for flere fremmednøgler?
I relationelle databaser implementerer fremmednøgler forskellige typer databaserelationer.
For at implementere en en-til-mange-relation i SQL Server skal du f.eks. tilføje en fremmednøgle i en tabel, der er på mange sider af en-til-mange forholdet.
Den fremmede nøgle refererer til den primære nøgle eller den unikke identitetsnøgle for tabellen, der er på one side af bordet. Derfor i et en-til-mange forhold mellem afdelingen og medarbejder tabeller, vi diskuterede ovenfor, medarbejderen tabel vil gemme en fremmednøgle, der refererer til den primære nøgle i afdelingen tabel.
I scenarier, hvor en tabel kan have relationer med flere andre tabeller, skal du tilføje flere fremmednøgler til en tabel. For medarbejderen tabel, skal du tilføje fremmednøgler, der refererer til de primære nøgler i afdelingen tabellen og Forsikringen bord. Tilsvarende er Employee_Office opslagstabel vil have to fremmednøgler, der refererer til medarbejderens primære nøgler og Kontor tabeller.
Tilføjelse af flere fremmednøgler med SQL Server
Følgende diagram viser databaseskemaet, som du vil implementere for vores simple eksempel:
Her kan du se, at databasen har fem tabeller:Medarbejder , Forsikring , Afdeling , Kontor , og Employee_Office .
Afdelingen og medarbejder tabeller har et en-til-mange forhold. Tilsvarende er Forsikringen og medarbejder tabeller har også et en-til-mange forhold. Kontoret og Medarbejdertabeller har en mange-til-mange-relation implementeret ved hjælp af to en-til-mange-relationer med Employee_Office opslagstabel.
Medarbejderen tabellen har to fremmednøgler, Dep_Id , og Insur_Id som refererer til de primære nøgler (Id) i Afdelingen og Forsikring henholdsvis tabeller.
Lad os nu udføre SQL-scriptet, der skaber den beskrevne database.
Start med at oprette tabeller uden fremmednøgler. Hvis du forsøger at oprette tabeller med fremmednøgler, der refererer til andre tabeller, der endnu ikke er oprettet, får du en fejl.
I vores databaseskema er Afdelingen , Organisation og Office tabeller har ingen fremmednøgler. Følgende script opretter en dummy-database ved navn Organisation og tilføjer tre tabeller i den:Afdeling , Forsikring og Office .
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
)
Du kan bruge UDENLANDSKE NØGLEREFERENCER begrænsning for at implementere en fremmed nøglerelation i SQL Server. Angiv tabelnavnet. Angiv derefter kolonnenavnet for fremmednøglen i parentes for at referere til den.
Følgende script opretter medarbejderen tabel med fremmednøgler Dep_Id og Insur_Id der refererer til Id-kolonner i Afdelingen og Forsikring hhv. tabeller.
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)
)
Til sidst opretter følgende script Employee_Office tabel med to fremmednøgler Emp_Id og 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)
)
Indsættelse af poster i tabeller med flere fremmednøgler
For at indsætte poster i tabeller med flere fremmednøgler, skal du først oprette tilsvarende poster i tabellerne, der refereres til af fremmednøgler i de originale tabeller.
I praksis at indsætte poster i medarbejderen tabel, skal vi først oprette tilsvarende poster i afdelingen og Forsikring tabeller. Det er fordi medarbejderen tabel indeholder fremmednøgler, der refererer til afdelingen og Forsikring tabeller.
Først forsøger vi at tilføje poster til medarbejderen tabel uden at angive fremmednøgler, der refererer til afdelingen og medarbejder tabeller.
INSERT INTO Employee
VALUES ('James', 10, 'Male'),
('Sara', 7, 'Female')
Du vil se følgende fejl. Det opstår, fordi antallet af angivne værdier ikke matcher antallet af kolonner i Medarbejder tabel.
Lad os prøve at tilføje nogle dummy-værdier for Dep_Id og Insur_Id kolonner (fremmednøgler):
INSERT INTO Employee
VALUES ('James', 10, 'Male', 2, 2),
('Sara', 7, 'Female', 1, 1)
Du vil se følgende fejl, da afdelings- og forsikringstabellerne ikke har poster med henholdsvis id 2 og 1.
Lad os nu indsætte poster i afdelingen , Forsikring , og Office tabeller:
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')
Siden Afdelingen og Forsikring tabeller har nu poster med Ids 2 og 1, du kan indsætte poster i Medarbejder tabeller med tilsvarende fremmednøgleværdier som vist nedenfor:
INSERT INTO Employee
VALUES ('James', 10, 'Male', 2, 2),
('Sara', 7, 'Female', 1, 1)
Indsæt nogle poster i Employee_Office bord. Men før det, lad os se Id-kolonnens værdier i medarbejdertabellen:
SELECT * FROM Employee
Medarbejderen kolonne indeholder poster med Id-værdier på 2 og 3. Du kan indsætte poster i Employee_Office tabel, hvor Emp_Id kolonne indeholder 2 eller 3 og Office_Id kolonne indeholder 1 eller 2.
INSERT INTO Employee_Office
VALUES (2, 1),
(2, 2),
(3,2)
Valg af poster fra tabeller med flere fremmednøgler
For at vælge poster fra tabeller med flere fremmednøgler skal du bruge JOINs.
Følgende script returnerer værdier af Navn og Køn kolonner fra Medarbejder tabellen og navnet kolonner fra Afdelingen og forsikringstabeller. Siden medarbejderen tabellen indeholder to fremmednøgler, du skal bruge to LEFT JOIN udsagn:
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
På samme måde kan du vælge værdier for Navn og Køn kolonner fra Medarbejder tabellen og navnet kolonne fra Kontor tabel ved hjælp af to LEFT JOIN-sætninger på opslagstabellen 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
SLETTNING af poster fra tabeller med flere fremmednøgler
Du kan slette poster fra tabeller med flere fremmednøgler. Sørg dog for, at tabellen ikke refereres af en fremmednøgle i en anden kolonne.
For eksempel bør du ikke slette poster fra afdelingen tabel, der refereres til af Emp_Id fremmednøgle i Medarbejder bord. Her er et eksempel:
DELETE FROM Department WHERE Id = 1
Siden posten med Id 1 i Afdelingen tabellen refereres af Emp_Id kolonnen i Medarbejder tabel, kan du ikke slette den som nævnt i ovenstående fejl. Først skal du slette alle poster fra medarbejderen tabel hvor Emp_Id er 1.
Medarbejdertabellen indeholder kun 1 sådan post (med Id-værdien 3). Lad os prøve at slette denne post med følgende forespørgsel:
DELETE FROM Employee WHERE Id = 3
Du vil se fejlen, der opstår, fordi Employee_Office indeholder en post, hvor Emp_Id fremmednøglekolonnen indeholder 3 poster. Derfor skal du først fjerne denne post:
Følgende script fjerner posten med Emp_Id værdi på 3 fra Employee_Office tabel.
DELETE FROM Employee_Office WHERE Emp_Id = 3
Til sidst fjerner følgende script posten med Id-værdier på 1 fra Medarbejder og afdeling kolonner.
DELETE FROM Employee WHERE Id = 1
DELETE FROM Department WHERE Id = 1
Konklusion
Således har vi undersøgt tilføjelse af flere fremmednøgler i SQL Server-tabeller ved hjælp af SQL-forespørgsler til at tilføje fremmednøgler. Håber, at disse praktiske eksempler brugt i artiklen også hjalp dig med at mestre dette emne.
Når du beskæftiger dig med fremmednøgler og tabelafhængigheder for at udføre arbejdsopgaverne, er det også nyttigt at bruge softwareværktøjerne til at forenkle rutinerne. Stærkt anbefalet er Visual Database Diagram som en dedikeret løsning til at se alle afhængigheder mellem tabeller. Du kan også generere præcis dokumentation for hele databasen, uanset dens kompleksitet med funktionen Database Documenter.
Begge disse værktøjer har til formål at reducere manuel belastning, automatisere processerne og fremskynde ydeevnen for at fjerne en vis byrde fra dine skuldre.