Database
 sql >> Datenbank >  >> RDS >> Database

So erstellen Sie eine Tabelle mit mehreren Fremdschlüsseln, ohne verwirrt zu werden

Tabellenbeziehungen verstehen

SQL Server fügt Fremdschlüssel hinzu, um Beziehungen zwischen Tabellen in einer relationalen Datenbank zu implementieren. Eine Tabelle kann Eins-zu-eins-, Eins-zu-viele- oder Viele-zu-viele-Beziehungen mit einer anderen Tabelle haben, abhängig von der Art der Daten, die Sie speichern möchten.

Eine Eins-zu-Eins-Beziehung ist einfach und wird selten verwendet. Jeder Datensatz in einer bestimmten Tabelle bezieht sich auf genau einen Datensatz in einer anderen Tabelle.

Beispielsweise können Sie den Namen, die ID und das Geschlecht des Benutzers in einer Tabelle speichern (Benutzer Tabelle) und ihre Adressen werden in der anderen Tabelle (Adresse) gespeichert Tisch). Jeder Datensatz im Benutzer Tabelle entspricht einem Datensatz in der Adresse Tisch. Umgekehrt jede Adresse in der Adresse Tabelle gehört nur zu einem Datensatz im Benutzer Tabelle.

Eins-zu-viele- und Viele-zu-viele-Beziehungen sind viel häufiger.

Stellen Sie sich ein Szenario vor, in dem Sie Informationen über die Mitarbeiter, Abteilungen, Versicherungsgesellschaften und Büroadressen der Mitarbeiter einer Organisation speichern.

Wir gehen davon aus, dass ein Mitarbeiter nur einer einzigen Abteilung angehören und sich nur bei einer Versicherungsgesellschaft anmelden kann. Abteilungen und Versicherungsunternehmen können jedoch mehrere Mitarbeiter haben. Die Abteilung und Mitarbeiter Tabellen würden eine Eins-zu-Viele-Beziehung haben. Ebenso die Versicherung und Mitarbeiter Tabellen hätte eine 1:n-Beziehung.

Außerdem kann die Organisation mehrere Büros haben und ein Mitarbeiter kann in mehr als einem Büro arbeiten. Außerdem kann ein Büro mehrere Mitarbeiter haben. In diesem Fall das Büro und Mitarbeiter Tabellen hätten eine Viele-zu-Viele-Beziehung.

Um die Viele-zu-Viele-Beziehung zu implementieren, müssen Sie eine Nachschlagetabelle erstellen, die zwei Tabellen in einer Viele-zu-Viele-Beziehung verbindet. Die Originaltabellen enthalten eine Eins-zu-Viele-Beziehung mit der Nachschlagetabelle.

Betrachten wir die Erstellung einer Viele-zu-Viele-Beziehung zwischen dem Mitarbeiter und Büro Tische. Sie würden eine neue Nachschlagetabelle Employee_Office erstellen . Dann erstellen Sie eine 1:n-Beziehung zwischen dem Mitarbeiter und Employee_Office Tische und das Büro und Employee_Office Tabellen.

Sehen wir uns nun an, wie Fremdschlüssel in diese Diskussion passen.

Was sind Fremdschlüssel und warum brauchen Sie mehrere Fremdschlüssel?

In relationalen Datenbanken implementieren Fremdschlüssel verschiedene Arten von Datenbankbeziehungen.

Um beispielsweise eine Eins-zu-Viele-Beziehung in SQL Server zu implementieren, müssen Sie einen Fremdschlüssel in einer Tabelle hinzufügen, die sich auf den vielen befindet Seiten der 1:n-Beziehung.

Der Fremdschlüssel verweist auf den Primärschlüssel oder den eindeutigen Identitätsschlüssel der Tabelle, die sich auf einem befindet Seite des Tisches. Daher in einer Eins-zu-Viele-Beziehung zwischen der Abteilung und Mitarbeiter Tabellen, die wir oben besprochen haben, der Mitarbeiter Tabelle speichert einen Fremdschlüssel, der auf den Primärschlüssel der Abteilung verweist Tabelle.

In Szenarien, in denen eine Tabelle Beziehungen zu mehreren anderen Tabellen haben kann, müssen Sie einer Tabelle mehrere Fremdschlüssel hinzufügen. Für den Mitarbeiter müssen Sie Fremdschlüssel hinzufügen, die auf die Primärschlüssel der Abteilung verweisen Tabelle und die Versicherung Tisch. Ebenso das Employee_Office Nachschlagetabelle hat zwei Fremdschlüssel, die auf die Primärschlüssel des Employee verweisen und Büro Tabellen.

Mehrere Fremdschlüssel mit SQL Server hinzufügen

Das folgende Diagramm zeigt das Datenbankschema, das Sie für unser einfaches Beispiel implementieren werden:

Hier sehen Sie, dass die Datenbank fünf Tabellen hat:Employee , Versicherung , Abteilung , Büro und Employee_Office .

Die Abteilung und Mitarbeiter Tabellen haben eine Eins-zu-Viele-Beziehung. Ebenso die Versicherung und Mitarbeiter Tabellen haben auch eine Eins-zu-Viele-Beziehung. Das Büro und Employee-Tabellen haben eine Viele-zu-Viele-Beziehung, die mithilfe von zwei Eins-zu-Vielen-Beziehungen mit Employee_Office implementiert wird Nachschlagetabelle.

Der Mitarbeiter Tabelle hat zwei Fremdschlüssel, Dep_Id und Insur_Id die sich auf die Primärschlüssel (Id) der Abteilung beziehen und Versicherung Tabellen.

Lassen Sie uns nun das SQL-Skript ausführen, das die beschriebene Datenbank erstellt.

Beginnen Sie damit, Tabellen ohne Fremdschlüssel zu erstellen. Wenn Sie versuchen, Tabellen mit Fremdschlüsseln zu erstellen, die auf andere, noch nicht erstellte Tabellen verweisen, erhalten Sie eine Fehlermeldung.

In unserem Datenbankschema die Abteilung , Organisation und Büro Tabellen haben keine Fremdschlüssel. Das folgende Skript erstellt eine Dummy-Datenbank mit dem Namen Organisation und fügt darin drei Tabellen hinzu:Department , Versicherung und Büro .

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
)

Sie können die FREMDSCHLÜSSELVERWEISE verwenden Einschränkung zum Implementieren einer Fremdschlüsselbeziehung in SQL Server. Geben Sie den Tabellennamen an. Geben Sie dann in Klammern den Spaltennamen für den Fremdschlüssel an, um darauf zu verweisen.

Das folgende Skript erstellt den Employee Tabelle mit Fremdschlüssel Dep_Id und Insur_Id diese Referenz-ID-Spalten in der Abteilung und Versicherung Tabellen bzw..

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

Schließlich erstellt das folgende Skript das Employee_Office Tabelle mit zwei Fremdschlüsseln Emp_Id und 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)
)

Einfügen von Datensätzen in Tabellen mit mehreren Fremdschlüsseln

Um Datensätze mit mehreren Fremdschlüsseln in Tabellen einzufügen, sollten Sie zunächst entsprechende Datensätze in den Tabellen erstellen, auf die durch Fremdschlüssel in den Originaltabellen verwiesen wird.

In der Praxis, um Datensätze in Employee einzufügen Tabelle müssen wir zunächst entsprechende Datensätze in der Abteilung erstellen und Versicherung Tische. Es liegt daran, dass der Mitarbeiter Tabelle enthält Fremdschlüssel, die auf die Abteilung verweisen und Versicherung Tabellen.

Zuerst versuchen wir, Datensätze zu Employee hinzuzufügen Tabelle ohne Angabe von Fremdschlüsseln, die auf die Abteilung verweisen und Mitarbeiter Tabellen.

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

Sie werden den folgenden Fehler sehen. Dies tritt auf, weil die Anzahl der angegebenen Werte nicht mit der Anzahl der Spalten im Employee übereinstimmt Tabelle.

Lassen Sie uns versuchen, einige Dummy-Werte für die Dep_Id hinzuzufügen und Versicherten-ID Spalten (Fremdschlüssel):

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

Sie sehen den folgenden Fehler, da die Tabellen „Department“ und „Insurance“ keine Datensätze mit den IDs 2 bzw. 1 enthalten.

Lassen Sie uns nun Datensätze in die Abteilung einfügen , Versicherung und Büro 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')

Seit der Abteilung und Versicherung Tabellen haben jetzt Datensätze mit den IDs 2 und 1, Sie können Datensätze in Employee einfügen Tabellen mit entsprechenden Fremdschlüsselwerten wie unten gezeigt:

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

Fügen Sie einige Datensätze in das Employee_Office ein Tisch. Aber vorher sehen wir uns die Werte der Id-Spalte in der Employee-Tabelle an:

SELECT * FROM Employee

Der Mitarbeiter Spalte enthält Datensätze mit den ID-Werten 2 und 3. Sie können Datensätze in Employee_Office einfügen Tabelle, in der die Emp_Id Spalte enthält 2 oder 3 und die Office_Id Spalte enthält 1 oder 2.

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

Auswahl von Datensätzen aus Tabellen mit mehreren Fremdschlüsseln

Um Datensätze aus Tabellen mit mehreren Fremdschlüsseln auszuwählen, benötigen Sie JOINs.

Das folgende Skript gibt Werte von Name zurück und Geschlecht Spalten vom Mitarbeiter Tabelle und den Namen Spalten aus der Abteilung und Versicherungstabellen. Da der Mitarbeiter Tabelle zwei Fremdschlüssel enthält, müssen Sie zwei LEFT JOIN verwenden Anweisungen:

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

Auf die gleiche Weise können Sie Werte für den Namen auswählen und Geschlecht Spalten vom Mitarbeiter Tabelle und den Namen Spalte aus dem Büro Tabelle mit zwei LEFT JOIN-Anweisungen in der Lookup-Tabelle 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

LÖSCHEN von Datensätzen aus Tabellen mit mehreren Fremdschlüsseln

Sie können Datensätze aus Tabellen mit mehreren Fremdschlüsseln löschen. Stellen Sie jedoch sicher, dass die Tabelle nicht von einem Fremdschlüssel in einer anderen Spalte referenziert wird.

Beispielsweise sollten Sie keine Datensätze aus der Abteilung löschen Tabelle, die von der Emp_Id referenziert wird Fremdschlüssel im Employee Tisch. Hier ist ein Beispiel:

DELETE FROM Department WHERE Id = 1

Seit dem Datensatz mit Id 1 in der Abteilung Tabelle wird durch die Emp_Id referenziert Spalte Mitarbeiter table, können Sie sie nicht löschen, wie im obigen Fehler erwähnt. Zuerst müssen Sie alle Datensätze des Mitarbeiters löschen Tabelle, wobei Emp_Id ist 1.

Die Employee-Tabelle enthält nur einen solchen Datensatz (mit dem ID-Wert 3). Versuchen wir, diesen Datensatz mit der folgenden Abfrage zu löschen:

DELETE FROM Employee WHERE Id = 3

Sie sehen den Fehler, der auftritt, weil Employee_Office enthält einen Datensatz, in dem die Emp_Id Fremdschlüsselspalte enthält 3 Datensätze. Daher müssen Sie diesen Eintrag zuerst entfernen:

Das folgende Skript entfernt den Datensatz mit der Emp_Id Wert 3 aus dem Employee_Office Tabelle.

DELETE FROM Employee_Office WHERE Emp_Id = 3

Schließlich entfernt das folgende Skript den Datensatz mit den ID-Werten 1 aus Employee und Abteilung Spalten.

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

Schlussfolgerung

Daher haben wir das Hinzufügen mehrerer Fremdschlüssel in SQL Server-Tabellen mithilfe der SQL-Abfragen zum Hinzufügen von Fremdschlüsseln untersucht. Ich hoffe, dass diese praktischen Beispiele, die im Artikel verwendet wurden, Ihnen auch geholfen haben, dieses Thema zu meistern.

Wenn Sie sich mit Fremdschlüsseln und Tabellenabhängigkeiten beschäftigen, um die Arbeitsaufgaben auszuführen, ist es auch hilfreich, die Softwaretools zu verwenden, um die Routinen zu vereinfachen. Sehr zu empfehlen ist das Visual Database Diagram als dedizierte Lösung zum Anzeigen aller Abhängigkeiten zwischen Tabellen. Außerdem können Sie mit der Database Documenter-Funktion eine genaue Dokumentation für die gesamte Datenbank erstellen, unabhängig von ihrer Komplexität.

Beide Tools zielen darauf ab, die manuelle Belastung zu reduzieren, die Prozesse zu automatisieren und die Leistung zu beschleunigen, um Ihnen etwas Last von den Schultern zu nehmen.