In SQL erstellen Sie eine Beziehung, indem Sie eine Fremdschlüsseleinschränkung erstellen.
Genauer gesagt haben Sie eine übergeordnete Tabelle und eine untergeordnete Tabelle. Die übergeordnete Tabelle enthält den Primärschlüssel und die untergeordnete Tabelle enthält einen Fremdschlüssel, der auf den Primärschlüssel der übergeordneten Tabelle verweist.
Wenn Sie SQL verwenden, um eine Beziehung zu erstellen, können Sie die Beziehung zu dem Zeitpunkt erstellen, an dem Sie die Tabelle erstellen, oder Sie können sie später erstellen (indem Sie die Tabelle ändern). Dieser Artikel behandelt beide Szenarien.
Beim Erstellen der Tabelle eine Beziehung erstellen
Hier ist ein Beispiel für das Erstellen einer Beziehung innerhalb Ihrer CREATE TABLE
Anweisung beim Erstellen der Tabelle.
CREATE TABLE Parent (
ParentId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ParentName nvarchar(255) NOT NULL
)
CREATE TABLE Child (
ChildId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ChildName nvarchar(255) NOT NULL,
ParentId int NOT NULL
CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)
REFERENCES Parent (ParentId)
);
Hier habe ich zwei Tabellen erstellt; eine namens Parent
und das andere namens Child
.
Ich habe die Beziehung innerhalb der Tabellendefinition für Kind erstellt. Die Beziehung wird mit dem CONSTRAINT
erstellt Streit. Beachten Sie, dass sich dies immer noch in CREATE TABLE
befindet Aussage.
Die Beziehung braucht einen Namen. In diesem Fall habe ich es FK_Child_Parent
genannt . Der FOREIGN KEY
Teil folgt der Name der Spalte (in der untergeordneten Tabelle), die der Fremdschlüssel sein wird.
Die REFERENCES
part gibt die Spalte an, auf die der Fremdschlüssel verweist. In diesem Fall verweist es auf die ParentId
Spalte von Parent
Tisch. Dies geschieht mit REFERENCES Parent (ParentId)
.
Das ist alles, was zum Erstellen der Beziehung erforderlich ist.
Beachten Sie, dass die Beispiele auf dieser Seite mit SQL Server erstellt wurden. Abhängig von Ihrem DBMS müssen Sie möglicherweise einige Details der Spaltendefinitionen ändern.
Zum Beispiel IDENTITY
ist die SQL Server-Version dessen, was manchmal AUTO_INCREMENT
genannt wird in anderen DBMS (z. B. MySQL). Wenn Sie SQLite verwenden, erfahren Sie hier, wie Sie eine automatisch inkrementierende Spalte in SQLite erstellen.
Eine Beziehung zu einer bestehenden Tabelle hinzufügen
Sie können auch eine Beziehung zu einer bestehenden Tabelle hinzufügen, indem Sie einfach ALTER TABLE
verwenden Aussage.
Nehmen wir an, dass wir die Beziehung nicht erstellt haben, als wir die beiden Tabellen aus dem vorherigen Beispiel erstellt haben. Tun wir also so, als hätten wir stattdessen Folgendes getan:
CREATE TABLE Parent (
ParentId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ParentName nvarchar(255) NOT NULL
)
CREATE TABLE Child (
ChildId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ChildName nvarchar(255) NOT NULL,
ParentId int NOT NULL
);
In diesem Szenario haben wir also nur zwei Tabellen erstellt. Es wurde keine Beziehung zwischen ihnen hergestellt.
Jetzt, nachdem wir die Tabellen erstellt haben, erinnern wir uns plötzlich „Oh verdammt, ich habe vergessen, eine Beziehung zu erstellen!“.
Kein Problem, wir können das jetzt tun:
ALTER TABLE Child
ADD CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)
REFERENCES Parent (ParentId);
Erledigt. Wir haben gerade die Beziehung mit den gleichen Details wie im vorherigen Beispiel hinzugefügt.
Beachten Sie, dass SQLite das Hinzufügen von Fremdschlüsseln mit ALTER TABLE
nicht unterstützt Erklärung. Weitere Informationen dazu finden Sie unter So fügen Sie einer vorhandenen Tabelle in SQLite einen Fremdschlüssel hinzu.
Beim Aktualisieren/Löschen
Standardmäßig werden SQL Server-Beziehungen mit ON DELETE NO ACTION
erstellt und ON UPDATE NO ACTION
. Daher wurden die vorherigen Beispiele mit dieser Einstellung erstellt.
Unterschiedliche DBMS können jedoch andere Standardeinstellungen verwenden.
In beiden Fällen können Sie dies explizit in Ihrem Code angeben. Wir können also das vorherige Beispiel so ändern, dass es so aussieht:
ALTER TABLE Child
ADD CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)
REFERENCES Parent (ParentId)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
Das bedeutet eigentlich, dass beim Versuch, einen Datensatz im Primärschlüssel zu löschen oder zu aktualisieren, ein Fehler auftritt und die Änderung rückgängig gemacht wird. Auf diese Weise verhindert SQL Server Änderungen, die die referentielle Integrität Ihres Systems beeinträchtigen könnten.
Grundsätzlich besteht der Grund, warum Sie überhaupt eine Beziehung erstellen, darin, die referenzielle Integrität zu erzwingen.
Sie haben jedoch einige Optionen, wie SQL Server mit diesen Situationen umgehen soll.
Insbesondere können Sie einen der folgenden Werte verwenden:
NO ACTION
:Ein Fehler wird ausgelöst und die Lösch-/Aktualisierungsaktion für die Zeile in der übergeordneten Tabelle wird rückgängig gemacht.CASCADE
:Entsprechende Zeilen werden aus der referenzierenden Tabelle gelöscht/aktualisiert, wenn diese Zeile aus der übergeordneten Tabelle gelöscht/aktualisiert wird.SET NULL
:Alle Werte, die den Fremdschlüssel bilden, werden aufNULL
gesetzt wenn die entsprechende Zeile in der übergeordneten Tabelle gelöscht oder aktualisiert wird. Dies erfordert, dass die Fremdschlüsselspalten nullable sind.SET DEFAULT
:Alle Werte, die den Fremdschlüssel bilden, werden auf ihre Standardwerte gesetzt, wenn die entsprechende Zeile in der übergeordneten Tabelle gelöscht oder aktualisiert wird. Damit diese Einschränkung ausgeführt werden kann, müssen alle Fremdschlüsselspalten Standarddefinitionen haben. Wenn eine Spalte nullfähig ist und kein expliziter Standardwert festgelegt ist,NULL
wird zum impliziten Standardwert der Spalte.