sql >> Databasteknik >  >> RDS >> Database

Hur man skapar en tabell med flera främmande nycklar och inte blir förvirrad

Förstå tabellrelationer

SQL-servern lägger till främmande nycklar för att implementera relationer mellan tabeller i en relationsdatabas. En tabell kan ha en-till-en-, en-till-många- eller många-till-många-relationer med en annan tabell, beroende på vilken typ av data du vill lagra.

En en-till-en-relation är enkel och används sällan. Varje post i en viss tabell relaterar till exakt en post i en annan tabell.

Du kan till exempel lagra användarens namn, id och kön i en tabell (Användare tabell) och deras adresser kommer att lagras i den andra tabellen (Adress tabell). Varje post i Användare tabellen kommer att motsvara en post i Adressen tabell. Omvänt, varje adress i Adress Tabell kommer att tillhöra endast en post i Användare bord.

En-till-många- och många-till-många-relationer är mycket vanligare.

Tänk på ett scenario där du lagrar information om en organisations anställda, avdelningar, anställdas försäkringsbolag och anställdas kontorsadresser.

Vi förutsätter att en anställd endast kan tillhöra en enskild avdelning och endast kan teckna ett försäkringsbolag. Däremot kan avdelningar och försäkringsbolag ha flera anställda. Avdelningen och Anställd tabeller skulle ha en en-till-många-relation. Likaså försäkringen och tabeller för anställda skulle ha en en-till-många-relation.

Dessutom kan organisationen ha flera kontor, och en anställd kan arbeta på mer än ett kontor. Dessutom kan ett kontor ha flera anställda. I det här fallet, Office och Anställd tabeller skulle ha en många-till-många-relation.

För att implementera många-till-många-relationen måste du skapa en uppslagstabell som kopplar samman två tabeller i en många-till-många-relation. De ursprungliga tabellerna innehåller en en-till-många-relation med uppslagstabellen.

Låt oss överväga att skapa en många-till-många-relation mellan anställda och Kontor tabeller. Du skulle skapa en ny uppslagstabell Employee_Office . Sedan skapar du en en-till-många-relation mellan Anställd och Employee_Office tabeller och kontoret och Employee_Office tabeller.

Låt oss nu se hur främmande nycklar passar i den här diskussionen.

Vad är främmande nycklar och varför behöver du flera främmande nycklar?

I relationsdatabaser implementerar främmande nycklar olika typer av databasrelationer.

Till exempel, för att implementera en en-till-många-relation i SQL Server, måste du lägga till en främmande nyckel i en tabell som finns på många sidor av en-till-många-relationen.

Den främmande nyckeln refererar till primärnyckeln eller den unika identitetsnyckeln för tabellen som finns på ett sidan av bordet. Alltså i en en-till-många-relation mellan avdelningen och Anställd tabeller som vi diskuterade ovan, Anställd tabellen kommer att lagra en främmande nyckel som refererar till primärnyckeln för avdelningen bord.

I scenarier där en tabell kan ha relationer med flera andra tabeller, måste du lägga till flera främmande nycklar till en tabell. För anställd tabell måste du lägga till främmande nycklar som refererar till primärnycklarna för avdelningen tabellen och försäkringen tabell. På liknande sätt, Employee_Office uppslagstabellen kommer att ha två främmande nycklar som refererar till Anställds primärnycklar och Kontor tabeller.

Lägga till flera främmande nycklar med SQL Server

Följande diagram visar databasschemat som du ska implementera för vårt enkla exempel:

Här kan du se att databasen har fem tabeller:Anställd , Försäkring , Avdelning , Kontor , och Employee_Office .

Avdelningen och Anställd tabeller har en en-till-många-relation. Likaså försäkringen och Anställd tabeller har också en en-till-många-relation. Kontoret och Employee-tabeller har en många-till-många-relation implementerad med två en-till-många-relationer med Employee_Office uppslagstabell.

Anställd tabellen har två främmande nycklar, Dep_Id och Insur_Id som hänvisar till primärnycklarna (Id) för avdelningen och försäkring tabeller, respektive.

Låt oss nu köra SQL-skriptet som skapar den beskrivna databasen.

Börja med att skapa tabeller utan främmande nycklar. Om du försöker skapa tabeller med främmande nycklar som refererar till andra tabeller som ännu inte har skapats får du ett felmeddelande.

I vårt databasschema, Avdelningen , Organisation och Office tabeller har inga främmande nycklar. Följande skript skapar en dummydatabas med namnet Organisation och lägger till tre tabeller i den:Avdelning , Försäkring och 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 använda FREIGN KEY REFERENCER begränsning för att implementera en främmande nyckelrelation i SQL Server. Ange tabellnamnet. Ange sedan kolumnnamnet för den främmande nyckeln inom parentes för att referera till den.

Följande skript skapar Anställd tabell med främmande nycklar Dep_Id och Insur_Id som refererar till Id-kolumner i Avdelning och försäkring tabeller respektive.

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

Slutligen skapar följande skript Employee_Office tabell med två främmande nycklar Emp_Id och 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)
)

Infoga poster i tabeller med flera främmande nycklar

För att infoga poster i tabeller med flera främmande nycklar, bör du först skapa motsvarande poster i tabellerna som refereras av främmande nycklar i de ursprungliga tabellerna.

I praktiken, för att infoga poster i Anställd tabell måste vi först skapa motsvarande poster i avdelningen och försäkring tabeller. Det beror på att anställd Tabellen innehåller främmande nycklar som refererar till avdelningen och försäkring tabeller.

Först försöker vi lägga till poster i Anställd tabell utan att ange främmande nycklar som refererar till avdelningen och Anställd tabeller.

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

Du kommer att se följande fel. Det beror på att antalet angivna värden inte matchar antalet kolumner i Anställd bord.

Låt oss försöka lägga till några dummyvärden för Dep_Id och Insur_Id kolumner (främmande nycklar):

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

Du kommer att se följande fel eftersom avdelnings- och försäkringstabellerna inte har poster med id 2 respektive 1.

Låt oss nu infoga poster i avdelningen , Försäkring och 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')

Sedan avdelningen och försäkring tabeller har nu poster med Ids 2 och 1, du kan infoga poster i Anställd tabeller med motsvarande främmande nyckelvärden enligt nedan:

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

Infoga några poster i Employee_Office tabell. Men innan det, låt oss se Id-kolumnvärdena i tabellen Employee:

SELECT * FROM Employee

Anställd kolumnen innehåller poster med Id-värden 2 och 3. Du kan infoga poster i Employee_Office tabell där Emp_Id kolumnen innehåller 2 eller 3 och Office_Id kolumnen innehåller 1 eller 2.

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

Välja poster från tabeller med flera främmande nycklar

För att välja poster från tabeller med flera främmande nycklar behöver du JOINs.

Följande skript returnerar värden för Namn och Kön kolumner från Anställd tabellen och namnet kolumner från avdelningen och försäkringstabeller. Sedan anställd tabellen innehåller två främmande nycklar, du måste använda två LEFT JOIN uttalanden:

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å samma sätt kan du välja värden för Namn och Kön kolumner från Anställd tabellen och namnet kolumnen från Office tabell med två LEFT JOIN-satser i uppslagstabellen 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

RADERA poster från tabeller med flera främmande nycklar

Du kan ta bort poster från tabeller med flera främmande nycklar. Se dock till att tabellen inte refereras av en främmande nyckel i en annan kolumn.

Du bör till exempel inte ta bort poster från avdelningen tabell som refereras av Emp_Id främmande nyckel i Anställd tabell. Här är ett exempel:

DELETE FROM Department WHERE Id = 1

Sedan posten med ID 1 i avdelningen tabellen refereras av Emp_Id kolumnen i Anställd tabell kan du inte ta bort den som nämnts i ovanstående fel. Först måste du ta bort alla poster från anställd tabell där Emp_Id är 1.

Medarbetartabellen innehåller endast 1 sådan post (med Id-värdet 3). Låt oss försöka ta bort posten med följande fråga:

DELETE FROM Employee WHERE Id = 3

Du kommer att se felet som uppstår eftersom Employee_Office innehåller en post där Emp_Id kolumnen för främmande nyckel innehåller 3 poster. Därför måste du först ta bort posten:

Följande skript tar bort posten med Emp_Id värde på 3 från Employee_Office bord.

DELETE FROM Employee_Office WHERE Emp_Id = 3

Slutligen tar följande skript bort posten med Id-värden 1 från Anställd och Avdelning kolumner.

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

Slutsats

Därför har vi undersökt att lägga till flera främmande nycklar i SQL Server-tabeller med hjälp av SQL-frågor för att lägga till främmande nycklar. Hoppas att dessa praktiska exempel som används i artikeln också hjälpte dig att bemästra detta ämne.

När du hanterar främmande nycklar och tabellberoenden för att utföra arbetsuppgifterna är det också bra att använda mjukvaruverktygen för att förenkla rutinerna. Rekommenderas starkt är Visual Database Diagram som en dedikerad lösning för att visa alla beroenden mellan tabeller. Du kan också skapa exakt dokumentation för hela databasen, oavsett dess komplexitet med funktionen Database Documenter.

Båda dessa verktyg syftar till att minska manuell belastning, automatisera processerna och påskynda prestandan för att ta lite börda från dina axlar.


  1. Hur skriver man en skiftlägesokänslig fråga för både MySQL och Postgres?

  2. 4 sätt att ta reda på vilka kolumner som kommer att returneras av en lagrad procedur i SQL Server

  3. Hur man tar bort pivottabellen i MySQL

  4. Hur kan jag skapa en kopia av en Oracle-tabell utan att kopiera data?