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

Erstellen Sie eine Beziehung in SQL

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 auf NULL 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.