sql >> Databáze >  >> RDS >> Database

Jak vytvořit tabulku s více cizími klíči a nenechat se zmást

Porozumění vztahům tabulek

SQL server přidává cizí klíče k implementaci vztahů mezi tabulkami v relační databázi. Tabulka může mít vztahy jedna k jedné, jedna k mnoha nebo mnoho k mnoha s jinou tabulkou v závislosti na typu dat, která chcete uložit.

Vztah jeden k jednomu je jednoduchý a málo používaný. Každý záznam v konkrétní tabulce se vztahuje přesně k jednomu záznamu v jiné tabulce.

Můžete například uložit jméno, ID a pohlaví uživatele do jedné tabulky (Uživatel tabulka) a jejich adresy budou uloženy v jiné tabulce (Adresa stůl). Každý záznam v Uživatel tabulka bude odpovídat jednomu záznamu v Adresa stůl. Naopak každá adresa v Adresa tabulka bude patřit pouze jednomu záznamu v Uživatel tabulka.

Vztahy one-to-many a many-to-many jsou mnohem častější.

Zvažte scénář, ve kterém ukládáte informace o zaměstnancích, odděleních, pojišťovnách zaměstnanců a adresách kanceláří zaměstnanců.

Předpokládáme, že zaměstnanec může patřit pouze k jednomu oddělení a může se přihlásit pouze k jedné pojišťovně. Oddělení a pojišťovny však mohou mít více zaměstnanců. Oddělení a Zaměstnanec tabulky by měly vztah jedna k mnoha. Podobně Pojištění a tabulky zaměstnanců by měl vztah jeden k mnoha.

Organizace může mít také více kanceláří a zaměstnanec může pracovat ve více než jedné kanceláři. Kromě toho může mít kancelář více zaměstnanců. V tomto případě Kancelář a Zaměstnanec tabulky by měly vztah many-to-many.

Chcete-li implementovat vztah many-to-many, musíte vytvořit vyhledávací tabulku, která spojuje dvě tabulky ve vztahu many-to-many. Původní tabulky obsahují vztah jedna k mnoha s vyhledávací tabulkou.

Zvažme vytvoření vztahu mnoho k mnoha mezi zaměstnancem a Kancelář tabulky. Vytvořili byste novou vyhledávací tabulku Employee_Office . Poté vytvoříte vztah jeden k mnoha mezi zaměstnancem a Employee_Office tabulky a Kancelář a Employee_Office tabulky.

Podívejme se nyní, jak se cizí klíče hodí do této diskuse.

Co jsou cizí klíče a proč potřebujete více cizích klíčů?

V relačních databázích implementují cizí klíče různé typy databázových vztahů.

Chcete-li například implementovat vztah one-to-many na SQL Server, musíte přidat cizí klíč do tabulky, která je na many strany vztahu jeden k mnoha.

Cizí klíč odkazuje na primární klíč nebo jedinečný klíč identity tabulky, která je na jedničce straně stolu. Tedy ve vztahu jedna k mnoha mezi oddělením a Zaměstnanec tabulky, o kterých jsme hovořili výše, Zaměstnanec tabulka bude ukládat cizí klíč, který odkazuje na primární klíč oddělení tabulka.

Ve scénářích, kde může mít tabulka vztahy s více jinými tabulkami, budete muset do tabulky přidat více cizích klíčů. Pro Zaměstnance tabulky, musíte přidat cizí klíče, které odkazují na primární klíče oddělení tabulky a Pojištění stůl. Podobně Úřad zaměstnance vyhledávací tabulka bude mít dva cizí klíče, které odkazují na primární klíče Zaměstnance a Kancelář tabulky.

Přidání více cizích klíčů se serverem SQL

Následující diagram ukazuje schéma databáze, které se chystáte implementovat pro náš jednoduchý příklad:

Zde vidíte, že databáze má pět tabulek:Zaměstnanec , Pojištění , Oddělení , Kancelář a Employee_Office .

Oddělení a Zaměstnanec tabulky mají vztah jedna k mnoha. Podobně Pojištění a Zaměstnanec tabulky mají také vztah jedna k mnoha. Kancelář a Tabulky zaměstnanců mají vztah mnoho k mnoha implementovaný pomocí dvou vztahů jeden k mnoha s Employee_Office vyhledávací tabulka.

Zaměstnanec tabulka má dva cizí klíče, Dep_Id a Insur_Id které odkazují na primární klíče (ID) oddělení a Pojištění tabulky.

Nyní spusťte SQL skript, který vytvoří popsanou databázi.

Začněte vytvářením tabulek bez cizích klíčů. Pokud se pokusíte vytvořit tabulky s cizími klíči, které odkazují na jiné tabulky, které ještě nebyly vytvořeny, zobrazí se chyba.

V našem schématu databáze Oddělení , Organizace a Kancelář tabulky nemají žádné cizí klíče. Následující skript vytvoří fiktivní databázi s názvem Organizace a přidá do něj tři tabulky:Oddělení , Pojištění a Kancelář .

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
)

Můžete použít ZAHRANIČNÍ KLÍČOVÉ REFERENCE omezení pro implementaci vztahu cizího klíče na SQL Server. Zadejte název tabulky. Poté zadejte v závorkách název sloupce pro cizí klíč, aby se na něj odkazovalo.

Následující skript vytvoří Zaměstnance tabulka s cizími klíči Dep_Id a Insur_Id které odkazují na sloupce ID v oddělení a Pojištění tabulky.

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

Nakonec následující skript vytvoří Employee_Office tabulka se dvěma cizími klíči Emp_Id a ID Office .

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

Vkládání záznamů do tabulek s více cizími klíči

Chcete-li vložit záznamy do tabulek s více cizími klíči, měli byste nejprve vytvořit odpovídající záznamy v tabulkách, na které odkazují cizí klíče v původních tabulkách.

V praxi k vkládání záznamů do Zaměstnance tabulky, musíme nejprve vytvořit odpovídající záznamy v Oddělení a Pojištění tabulky. Je to proto, že Zaměstnanec tabulka obsahuje cizí klíče odkazující na Oddělení a Pojištění tabulky.

Nejprve se snažíme přidat záznamy do Zaměstnanec tabulky bez uvedení cizích klíčů odkazujících na Oddělení a Zaměstnanec tabulky.

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

Uvidíte následující chybu. Dochází k tomu, protože zadaný počet hodnot neodpovídá počtu sloupců v Zaměstnanec tabulka.

Zkusme přidat nějaké fiktivní hodnoty pro Dep_Id aInsur_Id sloupce (cizí klíče):

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

Uvidíte následující chybu, protože tabulky Oddělení a Pojištění nemají záznamy s ID 2 a 1.

Nyní vložíme záznamy do Oddělení , Pojištění a Kancelář tabulky:

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

Od oddělení a Pojištění tabulky nyní obsahují záznamy s ID 2 a 1, můžete vkládat záznamy do Zaměstnanec tabulky s odpovídajícími hodnotami cizího klíče, jak je uvedeno níže:

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

Vložte nějaké záznamy do Employee_Office stůl. Předtím se však podívejme na hodnoty sloupce ID v tabulce Zaměstnanec:

SELECT * FROM Employee

Zaměstnanec sloupec obsahuje záznamy s hodnotami ID 2 a 3. Záznamy můžete vkládat do Kancelář_zaměstnance tabulka, kde je Emp_Id sloupec obsahuje 2 nebo 3 a ID Office sloupec obsahuje 1 nebo 2.

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

Výběr záznamů z tabulek s více cizími klíči

Pro výběr záznamů z tabulek s více cizími klíči potřebujete JOINy.

Následující skript vrací hodnoty Název a Pohlaví sloupce od Zaměstnanec tabulka a Název sloupce z oddělení a Pojistné tabulky. Vzhledem k tomu, že Zaměstnanec tabulka obsahuje dva cizí klíče, musíte použít dva LEFT JOIN prohlášení:

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

Stejným způsobem můžete vybrat hodnoty Název a Pohlaví sloupce od Zaměstnanec tabulka a Název ze sloupce Kancelář tabulky pomocí dvou příkazů LEFT JOIN ve vyhledávací tabulce 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

SMAZÁNÍ záznamů z tabulek s více cizími klíči

Můžete odstranit záznamy z tabulek s více cizími klíči. Ujistěte se však, že na tabulku neodkazuje cizí klíč v jiném sloupci.

Například byste neměli odstraňovat záznamy z Oddělení tabulka, na kterou odkazuje Emp_Id cizí klíč v Zaměstnanec stůl. Zde je příklad:

DELETE FROM Department WHERE Id = 1

Od záznamu s ID 1 v Oddělení na tabulku odkazuje Emp_Id ve sloupci Zaměstnanec tabulky, nemůžete ji odstranit, jak je uvedeno ve výše uvedené chybě. Nejprve musíte odstranit všechny záznamy z Zaměstnance tabulka, kde je Emp_Id je 1.

Tabulka Zaměstnanec obsahuje pouze 1 takový záznam (s hodnotou Id 3). Pokusme se tento záznam smazat pomocí následujícího dotazu:

DELETE FROM Employee WHERE Id = 3

Zobrazí se chyba, ke které dochází, protože Employee_Office obsahuje záznam s Emp_Id Sloupec cizí klíč obsahuje 3 záznamy. Proto budete muset tento záznam nejprve odstranit:

Následující skript odstraní záznam s Emp_Id hodnotu 3 z Úřadu_zaměstnance tabulka.

DELETE FROM Employee_Office WHERE Emp_Id = 3

Nakonec následující skript odebere záznam s hodnotami ID 1 z Zaměstnance a Oddělení sloupce.

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

Závěr

Zkoumali jsme tedy přidání více cizích klíčů do tabulek SQL Server pomocí dotazů SQL pro přidání cizích klíčů. Doufáme, že i tyto praktické příklady použité v článku vám pomohly zvládnout toto téma.

Když se při provádění pracovních úkolů zabýváte cizími klíči a závislostmi tabulek, je také užitečné použít softwarové nástroje ke zjednodušení rutin. Vysoce doporučený je Visual Database Diagram jako vyhrazené řešení pro zobrazení všech závislostí mezi tabulkami. Pomocí funkce Database Documenter můžete také generovat přesnou dokumentaci pro celou databázi, bez ohledu na její složitost.

Oba tyto nástroje mají za cíl snížit manuální zátěž, automatizovat procesy a urychlit výkon, aby se z vašich ramen ubrala nějaká zátěž.


  1. Prodleva Oracle mezi potvrzením a výběrem

  2. Nejednoznačná chyba názvu sloupce na jednom konkrétním serveru

  3. Jak vytisknout několik zpráv s čárovým kódem \ nebo několik čárových kódů v jedné zprávě

  4. Spusťte dotazy PostgreSQL z příkazového řádku