Auf dieser Seite wird beschrieben, wie Sie Fremdschlüsselbeziehungen in Ihrer Datenbank verwalten.
Ein Fremdschlüssel ist eine Spalte, die von mehreren Tabellen gemeinsam genutzt wird, um eine Verknüpfung zwischen zusammengehörigen Daten herzustellen. Wenn Sie einen Fremdschlüssel verwenden, sorgt Spanner dafür, dass diese Beziehung beibehalten wird.
Das folgende Diagramm zeigt ein einfaches Datenbankschema, bei dem Daten in einer Tabelle eine Beziehung zu Daten in einer anderen Tabelle haben.
Abbildung 1. Diagramm einer Auftragsverarbeitungsdatenbank
Das Schema in Abbildung 1 enthält drei Tabellen:
- In der Tabelle
Customerswerden die Namen jedes Kunden aufgezeichnet. - Die Tabellen
Ordersverfolgen alle Bestellungen. - In der Tabelle
Productswerden die Produktinformationen für jedes Produkt gespeichert.
Zwischen diesen Tabellen gibt es zwei Fremdschlüsselbeziehungen:
Zwischen der Tabelle
Ordersund der TabelleCustomerswird eine Fremdschlüsselbeziehung definiert, um sicherzustellen, dass eine Bestellung nur dann angelegt werden kann, wenn eine entsprechender Kunde vorhanden ist.Eine Fremdschlüsselbeziehung zwischen der Tabelle
Ordersund der TabelleProductssorgt dafür, dass keine Bestellung für ein Produkt erstellt werden kann, das nicht existiert.
In diesem Thema werden die CONSTRAINT-Anweisungen der Datendefinitionssprache (DDL) erläutert, mit denen Sie Beziehungen zwischen Tabellen in einer Datenbank verwalten können. Als Beispiel dient das vorherige Schema.
Standardmäßig sind alle Fremdschlüssel in Spanner erzwungene Fremdschlüssel, die die referenzielle Integrität erzwingen. In Spanner können Sie auch informative Fremdschlüssel verwenden, die die referenzielle Integrität nicht validieren oder erzwingen. Weitere Informationen finden Sie unter Vergleich von Fremdschlüsseln und Fremdschlüsseltyp auswählen. Wenn nicht angegeben, sind die Fremdschlüssel in den Beispielen auf dieser Seite erzwungene Fremdschlüssel.
Fremdschlüssel zu einer neuen Tabelle hinzufügen
Angenommen, Sie haben in Ihrer einfachen Datenbank für Produktbestellungen eine Tabelle Customers erstellt. Sie benötigen jetzt eine Orders-Tabelle, um Informationen zu den Bestellungen der Kunden zu speichern. Damit alle Bestellungen gültig sind, möchten Sie nicht, dass das System Zeilen in die Tabelle Orders einfügt, es sei denn, es gibt auch einen übereinstimmenden Eintrag in der Tabelle Customers. Daher benötigen Sie einen erzwungenen Fremdschlüssel, um eine Beziehung zwischen den beiden Tabellen herzustellen. Eine Möglichkeit besteht darin, der neuen Tabelle eine CustomerID-Spalte hinzuzufügen und sie als Fremdschlüssel zu verwenden, um eine Beziehung zur CustomerID-Spalte in der Tabelle Customers herzustellen.
Wenn Sie eine neue Tabelle mit einem Fremdschlüssel erstellen, verwenden Sie REFERENCE, um eine Beziehung zu einer anderen Tabelle herzustellen. Die Tabelle, die die REFERENCE-Anweisung enthält, wird als referenzierende Tabelle bezeichnet. Die in der REFERENCE-Anweisung genannte Tabelle ist die referenzierte Tabelle. Die Spalte, die in der REFERENCE-Anweisung benannt ist, wird als referenzierende Spalte bezeichnet.
Im folgenden Beispiel wird gezeigt, wie Sie mit der DDL-Anweisung CREATE TABLE die Tabelle Orders mit einer Fremdschlüsseleinschränkung erstellen, die auf CustomerID in der Tabelle Customers verweist.
GoogleSQL
CREATE TABLE Orders (
OrderID INT64 NOT NULL,
CustomerID INT64 NOT NULL,
Quantity INT64 NOT NULL,
ProductID INT64 NOT NULL,
CONSTRAINT FK_CustomerOrder FOREIGN KEY (CustomerID) REFERENCES Customers (CustomerID)
) PRIMARY KEY (OrderID);
PostgreSQL
CREATE TABLE Orders (
OrderID BIGINT NOT NULL,
CustomerID BIGINT NOT NULL,
Quantity BIGINT NOT NULL,
ProductID BIGINT NOT NULL,
CONSTRAINT FK_CustomerOrder FOREIGN KEY (CustomerID) REFERENCES Customers (CustomerID),
PRIMARY KEY (OrderID)
);
Die vorherige Anweisung enthält eine CONSTRAINT-Klausel mit den folgenden Merkmalen:
Verwendung der
CONSTRAINT-Syntax, um eine Einschränkung zu benennen, sodass die Tabelle mit dem von Ihnen gewählten Namen leichter gelöscht werden kann.Die Einschränkung hat den Namen
FK_CustomerOrder. Einschränkungsnamen sind auf das Schema beschränkt und müssen innerhalb des Schemas eindeutig sein.Die Tabelle
Orders, für die Sie die Einschränkung definieren, ist die referenzierende Tabelle. Die TabelleCustomersist die referenzierte Tabelle.Die referenzierende Spalte in der referenzierenden Tabelle ist
CustomerID. Es verweist auf das FeldCustomerIDin der TabelleCustomers. Wenn jemand versucht, eine Zeile mit einerCustomerID, die nicht inCustomersvorhanden ist, inOrderseinzufügen, schlägt das Einfügen fehl.
Das folgende Beispiel zeigt eine alternative Anweisung zum Erstellen einer Tabelle. Hier wird die Fremdschlüsseleinschränkung ohne Namen definiert. Wenn Sie diese Syntax verwenden, generiert Cloud Spanner einen Namen für Sie. Informationen zum Ermitteln der Namen aller Fremdschlüssel finden Sie unter Attribute einer Fremdschlüsselbeziehung ansehen.
GoogleSQL
CREATE TABLE Orders (
OrderID INT64 NOT NULL,
CustomerID INT64 NOT NULL,
ProductID INT64 NOT NULL,
FOREIGN KEY (CustomerID) REFERENCES Customers (CustomerID)
) PRIMARY KEY (OrderID);
PostgreSQL
CREATE TABLE Orders (
OrderID BIGINT NOT NULL,
CustomerID BIGINT NOT NULL,
Quantity BIGINT NOT NULL,
ProductID BIGINT NOT NULL,
FOREIGN KEY (CustomerID) REFERENCES Customers (CustomerID),
PRIMARY KEY (OrderID)
);
Fremdschlüssel einer vorhandenen Tabelle hinzufügen
Außerdem möchten Sie sicherstellen, dass Kunden nur Produkte bestellen können, die auch existieren. Wenn Ihre Tabelle bereits Einschränkungen hat, müssen Sie alle Einschränkungen löschen. In Spanner müssen alle erzwungenen Einschränkungen in einer Tabelle gleichzeitig in einer einzigen Batch-DDL-Anweisung implementiert werden.
Wenn Ihre Tabelle keine Einschränkungen hat, können Sie mit der DDL-Anweisung ALTER TABLE eine erzwungene Fremdschlüsseleinschränkung zur vorhandenen Tabelle Orders hinzufügen, wie im folgenden Beispiel gezeigt:
ALTER TABLE Orders
ADD CONSTRAINT DB_ProductOrder FOREIGN KEY (ProductID) REFERENCES Products (ProductID);
Die verweisende Spalte in Orders ist ProductID und verweist auf die Spalte ProductID in Products. Wenn Sie damit einverstanden sind, dass Spanner diese Einschränkungen für Sie benennt, verwenden Sie die folgende Syntax:
ALTER TABLE Orders
ADD FOREIGN KEY (ProductID) REFERENCES Products (ProductID);
Fremdschlüssel mit einer Löschaktion zu einer neuen Tabelle hinzufügen
Erinnern Sie sich an das vorherige Beispiel, in dem Sie eine Customers-Tabelle in einer Datenbank für Produktbestellungen haben, die eine Orders-Tabelle benötigt. Sie möchten eine Fremdschlüsseleinschränkung hinzufügen, die auf die Tabelle Customers verweist. Sie möchten jedoch sicherstellen, dass Spanner beim Löschen eines Kundendatensatzes in Zukunft auch alle Bestellungen für diesen Kunden löscht. In diesem Fall sollten Sie die Aktion ON
DELETE CASCADE mit der Fremdschlüsseleinschränkung verwenden.
Die folgende CREATE TABLE-DDL-Anweisung für die Tabelle Orders enthält die Fremdschlüsseleinschränkung, die mit einer ON DELETE
CASCADE-Aktion auf die Tabelle Customers verweist.
GoogleSQL
CREATE TABLE Orders (
OrderID INT64 NOT NULL,
CustomerID INT64 NOT NULL,
Quantity INT64 NOT NULL,
ProductID INT64 NOT NULL,
CONSTRAINT FK_CustomerOrder FOREIGN KEY (CustomerID)
REFERENCES Customers (CustomerID) ON DELETE CASCADE
) PRIMARY KEY (OrderID);
PostgreSQL
CREATE TABLE Orders (
OrderID BIGINT NOT NULL,
CustomerID BIGINT NOT NULL,
Quantity BIGINT NOT NULL,
ProductID BIGINT NOT NULL,
FOREIGN KEY (CustomerID)
REFERENCES Customers (CustomerID) ON DELETE CASCADE,
PRIMARY KEY (OrderID)
);
Die vorherige Anweisung enthält eine Fremdschlüsseleinschränkung mit einer ON DELETE
CASCADE-Klausel. Die Spalte CustomerID ist ein Fremdschlüssel, der auf das Feld CustomerID in der Tabelle Customers verweist. Das bedeutet, dass jeder CustomerID-Wert in der Tabelle Orders auch in der Tabelle Customers vorhanden sein muss. Wenn jemand versucht, eine Zeile aus der Tabelle Customers zu löschen, werden alle Zeilen in der Tabelle Orders, die auf den gelöschten CustomerID-Wert verweisen, ebenfalls in derselben Transaktion gelöscht.
Ebenso können Sie mit der Aktion ON DELETE SET NULL die referenzierenden Spalten auf NULL setzen, anstatt die referenzierenden Zeilen zu löschen.
Wenn Sie ON DELETE SET NULL verwenden möchten, müssen die verweisenden Spalten Nullwerte zulassen (also nicht mit NOT NULL gekennzeichnet sein). Sie dürfen nicht Teil des Primärschlüssels oder der generierten Spalten der verweisenden Tabelle sein.
Weitere Informationen zum Vergleich von ON DELETE SET NULL und ON DELETE CASCADE in Bezug auf Mutationen, Lesevorgänge und kaskadierendes Verhalten finden Sie unter Ressourcennutzung für Löschaktionen für Fremdschlüssel.
Die folgende CREATE TABLE-DDL-Anweisung für die Tabelle Orders enthält eine Fremdschlüsseleinschränkung, die mit einer ON DELETE SET NULL-Aktion auf die Tabelle Customers verweist. In diesem Beispiel ist CustomerID in der Tabelle Orders nullfähig.
GoogleSQL
CREATE TABLE Orders (
OrderID INT64 NOT NULL,
CustomerID INT64,
Quantity INT64 NOT NULL,
ProductID INT64 NOT NULL,
CONSTRAINT FK_CustomerOrder FOREIGN KEY (CustomerID)
REFERENCES Customers (CustomerID) ON DELETE SET NULL
) PRIMARY KEY (OrderID);
PostgreSQL
CREATE TABLE Orders (
OrderID BIGINT NOT NULL,
CustomerID BIGINT,
Quantity BIGINT NOT NULL,
ProductID BIGINT NOT NULL,
CONSTRAINT FK_CustomerOrder FOREIGN KEY (CustomerID)
REFERENCES Customers (CustomerID) ON DELETE SET NULL,
PRIMARY KEY (OrderID)
);
Fremdschlüssel mit einer Löschaktion zu einer Tabelle hinzufügen
Außerdem möchten Sie sicherstellen, dass Bestellungen nur für Produkte erstellt werden, die tatsächlich existieren.
Mit ALTER TABLE können Sie der Tabelle „orders“ eine weitere Fremdschlüsseleinschränkung mit der Aktion ON DELETE
CASCADE hinzufügen:
ALTER TABLE Orders
ADD CONSTRAINT DB_ProductOrder FOREIGN KEY (ProductID)
REFERENCES Products (ProductID) ON DELETE CASCADE;
Wenn Sie eine Zeile aus der Tabelle Products löschen, werden alle Zeilen in der Tabelle Orders gelöscht, die auf den gelöschten ProductID-Wert verweisen. Sie können ON DELETE SET NULL auch in einer ALTER TABLE-Anweisung verwenden, wenn die referenzierende Spalte Nullwerte zulässt, nicht Teil des Primärschlüssels ist und keine generierte Spalte ist.
Informative Fremdschlüssel verwenden (nur GoogleSQL)
Mit informationalen Fremdschlüsseln kann der Abfrageoptimierer die Fremdschlüsselbeziehung nutzen, ohne dass der Aufwand für die Prüfung der referenziellen Integrität durch erzwungene Fremdschlüssel entsteht. Informative Fremdschlüssel sind nützlich, wenn die Durchsetzung einer strikten referenziellen Integrität entweder unpraktisch ist oder zu einem erheblichen Leistungsaufwand führt.
Stellen Sie sich vor, Sie möchten die Beziehungen zwischen den Tabellen Customers, Orders und Products modellieren. Die Durchsetzung einer strikten referenziellen Integrität in den Daten der Tabellen kann jedoch zu Leistungsengpässen führen, insbesondere in Spitzenzeiten mit hohem Bestellvolumen. Außerdem können Kunden Bestellungen für Produkte aufgeben, die eingestellt und aus der Tabelle Products entfernt wurden.
Sie können die Tabelle Orders mit informativen Fremdschlüsseln erstellen:
CREATE TABLE Orders (
OrderID INT64 NOT NULL,
CustomerID INT64 NOT NULL,
Quantity INT64 NOT NULL,
ProductID INT64 NOT NULL,
CONSTRAINT FK_CustomerOrder FOREIGN KEY (CustomerID) REFERENCES Customers (CustomerID) NOT ENFORCED,
CONSTRAINT FK_ProductOrder FOREIGN KEY (ProductID) REFERENCES Products (ProductID) NOT ENFORCED
) PRIMARY KEY (OrderID);
Wenn Sie einen informativen Fremdschlüssel mit NOT ENFORCED erstellen, besteht die Möglichkeit, dass eine Bestellung auf einen nicht vorhandenen Kunden oder ein nicht vorhandenes Produkt verweist.
Die Verwendung eines informativen Fremdschlüssels anstelle einer erzwungenen Fremdschlüsseleinschränkung ist eine gute Wahl, wenn ein Kundenkonto gelöscht oder ein Produkt eingestellt werden könnte. Bei einem informativen Fremdschlüssel führt Spanner keine Validierung der referenziellen Integrität durch. Dadurch wird der Schreibaufwand reduziert, was die Leistung während der Spitzenzeiten der Auftragsverarbeitung verbessern kann.
Sie können dem Abfrageoptimierer erlauben, die Beziehungen zu verwenden, um effiziente Abfragepläne zu generieren. Dadurch kann die Leistung von Abfragen verbessert werden, die die Tabellen über Fremdschlüsselspalten verknüpfen. Weitere Informationen finden Sie unter Informativer Fremdschlüssel zur Abfrageoptimierung.
Daten über Fremdschlüsselbeziehungen abfragen
SELECT * FROM Orders
INNER JOIN Customers ON Orders.CustomerID = Customers.CustomerID
INNER JOIN Products ON Orders.ProductsID = Products.ProductID;
Referenzielle Integrität mit erzwungenen Fremdschlüsseln
Der Hauptgrund für das Hinzufügen erzwungener Fremdschlüsselbeziehungen ist, dass Spanner die referenzielle Integrität Ihrer Daten aufrechterhalten kann. Wenn Sie Daten so ändern, dass eine Fremdschlüsseleinschränkung verletzt wird, schlägt die Aktualisierung mit einem Fehler fehl.
Sehen Sie sich die Daten in Abbildung 2 an. Einige Kunden haben Produkte bestellt, wie in der Tabelle Orders dargestellt. Aufgrund der geltenden erzwungenen Fremdschlüsseleinschränkung haben die in die Tabelle Orders eingefügten Daten referenzielle Integrität.
Abbildung 2. Beispieldaten in unserer Bestelldatenbank.
Die folgenden Beispiele zeigen, was passiert, wenn Sie versuchen, die Daten so zu ändern, dass die referenzielle Integrität verletzt wird.
Fügen Sie der Tabelle
Orderseine Zeile mit einemCustomerID-Wert hinzu, der inCustomersnicht vorhanden ist.Was passiert, wenn Sie die folgende Änderung mit den Beispieldaten aus dem vorherigen Diagramm versuchen?
INSERT INTO Orders (OrderID, ProductID, Quantity, CustomerID) VALUES (19, 337876, 4, 447);In diesem Fall würde das System versuchen, eine Zeile mit einer
CustomerID(447) inOrderseinzufügen, die in der TabelleCustomersnicht vorhanden ist. Wenn das System dies tun würde, hättest du eine ungültige Bestellung in deinem System. Mit der erzwungenen Fremdschlüsseleinschränkung, die Sie der TabelleOrdershinzugefügt haben, ist Ihre Tabelle jedoch geschützt. DerINSERTschlägt mit der folgenden Meldung fehl, vorausgesetzt, die Einschränkung heißtFK_CustomerOrder.Foreign key constraint `FK_CustomerOrder` is violated on table `Orders`. Cannot find referenced values in Customers(CustomerID).Im Gegensatz zu erzwungenen Fremdschlüsseln wird bei informativen Fremdschlüsseln die referenzielle Integrität nicht erzwungen. Wenn
FK_CustomerOrderein informativer Fremdschlüssel ist, ist die Einfügeanweisung erfolgreich, da Spanner nicht prüft, ob der entsprechendeCustomerIDin der TabelleCustomersvorhanden ist. Aus diesem Grund entsprechen die Daten möglicherweise nicht der durchFK_CustomerOrderdefinierten referenziellen Integrität.Versuch, eine Zeile aus der Tabelle
Customerszu löschen, wenn der Kunde in einer erzwungenen Fremdschlüsseleinschränkung referenziert wird.Stellen Sie sich vor, ein Kunde meldet sich von Ihrem Onlineshop ab. Sie möchten den Kunden aus Ihrem Backend entfernen und versuchen daher, den folgenden Vorgang auszuführen.
DELETE FROM Customers WHERE CustomerID = 721;In diesem Beispiel erkennt Spanner über die Fremdschlüsseleinschränkung, dass in der Tabelle
Ordersnoch Datensätze vorhanden sind, die auf die Kundenzeile verweisen, die Sie löschen möchten. In diesem Fall wird der folgende Fehler angezeigt.Foreign key constraint violation when deleting or updating referenced row(s): referencing row(s) found in table `Orders`.Löschen Sie zuerst alle verweisenden Einträge in
Orders, um dieses Problem zu beheben. Sie können den Fremdschlüssel auch mit der AktionON DELETE CASCADEdefinieren, damit Spanner das Löschen von verweisenden Einträgen übernimmt.Wenn
FK_CustomerOrderein informativer Fremdschlüssel ist, ist der Löschvorgang erfolgreich, da Spanner die referenzielle Integrität von informativen Fremdschlüsseln nicht garantiert.
Eigenschaften einer Fremdschlüsselbeziehung anzeigen
Das INFORMATION_SCHEMA von Spanner enthält Informationen zu Fremdschlüsseln und ihren Sicherungsindexen. Im Folgenden finden Sie einige Beispiele für Fragen, die Sie durch Abfragen des INFORMATION SCHEMA beantworten können.
Weitere Informationen zum Sichern von Indizes finden Sie unter Sicherungsindex für Fremdschlüssel.
Welche Einschränkungen sind in meiner Datenbank definiert?
SELECT tc.CONSTRAINT_NAME, tc.TABLE_NAME, tc.CONSTRAINT_TYPE
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS as tc
WHERE tc.CONSTRAINT_TYPE = 'FOREIGN KEY';
Welche Fremdschlüssel sind in meiner Datenbank definiert?
SELECT rc.CONSTRAINT_NAME, rc.UNIQUE_CONSTRAINT_NAME, rc.SPANNER_STATE
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as rc;
Welche Indexe sind Sekundärindexe für Fremdschlüssel, auch Sicherungsindexe genannt?
Fremdschlüssel-Sicherungsindexe werden von Spanner verwaltet. Wenn Sie also in der Ansicht INDEXES nach SPANNER_IS_MANAGED suchen , werden alle Sicherungsindexe zurückgegeben.
SELECT i.TABLE_NAME, i.INDEX_NAME, i.INDEX_TYPE, i.INDEX_STATE,
i.IS_UNIQUE, i.IS_NULL_FILTERED, i.SPANNER_IS_MANAGED
FROM INFORMATION_SCHEMA.INDEXES as i
WHERE SPANNER_IS_MANAGED = 'YES';
Was ist die referenzielle Aktion, die mit der Fremdschlüsseleinschränkung definiert wird?
SELECT rc.CONSTRAINT_NAME, rc.UNIQUE_CONSTRAINT_NAME, rc.DELETE_RULE,
rc.UPDATE_RULE
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS as rc;
Wird ein Fremdschlüssel erzwungen oder nicht erzwungen?
SELECT tc.CONSTRAINT_NAME, tc.TABLE_NAME, tc.CONSTRAINT_TYPE, tc.ENFORCED
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS as tc
WHERE tc.CONSTRAINT_TYPE = 'FOREIGN KEY';
Weitere Informationen finden Sie im Informationsschema.
Fremdschlüsselbeziehung entfernen
Die folgende DDL löscht eine Fremdschlüsseleinschränkung aus der Tabelle Orders.
ALTER TABLE Orders
DROP CONSTRAINT FK_CustomerOrder;
Die Sicherungsindexe für Fremdschlüssel werden automatisch gelöscht, wenn die Einschränkung selbst gelöscht wird.
Unterstützung von komplexeren Fremdschlüsselbeziehungen
In den folgenden Themen wird gezeigt, wie Sie Fremdschlüssel verwenden, um komplexere Beziehungen zwischen Tabellen zu erzwingen.
Mehrere Spalten
Fremdschlüssel können auf mehrere Spalten verweisen. Die Liste der Spalten bildet einen Schlüssel, der dem Primärschlüssel einer Tabelle oder einem Sicherungsindex entspricht. Die Referenztabelle enthält Fremdschlüssel des referenzierten Tabellenschlüssels.
Im folgenden Beispiel geben die erzwungenen Fremdschlüsseldefinitionen Folgendes an:
Jeder
SongName-Wert in der TabelleTopHitsmuss einen übereinstimmenden Wert in der TabelleSongshaben.Jedes Wertepaar
SingerFirstNameundSingerLastNamemuss ein übereinstimmendes WertepaarFirstNameundLastNamein der TabelleSingershaben.
GoogleSQL
CREATE TABLE TopHits (
Rank INT64 NOT NULL,
SongName STRING(MAX),
SingerFirstName STRING(MAX),
SingerLastName STRING(MAX),
-- Song names must either be NULL or have matching values in Songs.
FOREIGN KEY (SongName) REFERENCES Songs (SongName),
-- Singer names must either be NULL or have matching values in Singers.
FOREIGN KEY (SingerFirstName, SingerLastName)
REFERENCES Singers (FirstName, LastName)
) PRIMARY KEY (Rank);
PostgreSQL
CREATE TABLE TopHits (
Rank BIGINT NOT NULL,
SongName VARCHAR,
SingerFirstName VARCHAR,
SingerLastName VARCHAR,
-- Song names must either be NULL or have matching values in Songs.
FOREIGN KEY (SongName) REFERENCES Songs (SongName),
-- Singer names must either be NULL or have matching values in Singers.
FOREIGN KEY (SingerFirstName, SingerLastName)
REFERENCES Singers (FirstName, LastName),
PRIMARY KEY (Rank)
);
Zirkelverweise
Gelegentlich weisen Tabellen Zirkelbezüge auf, möglicherweise aus Legacy-Gründen oder aufgrund einer Denormalisierung. Spanner-Fremdschlüssel lassen zirkuläre Verweise zu. Da eine referenzierte Tabelle vorhanden sein muss, bevor ein Fremdschlüssel auf sie verweisen kann, muss einer der Fremdschlüssel mit einer ALTER TABLE-Anweisung hinzugefügt werden. Beispiel:
- Erstellen Sie
TableAohne Fremdschlüssel. - Erstellen Sie
TableBmit einer Fremdschlüsseleinschränkung fürTableA. - Verwenden Sie
ALTER TABLEfürTableA, um einen Fremdschlüsselverweis aufTableBzu erstellen.
Auf sich selbst verweisende Tabellen
Ein spezieller Typ von Zirkelbezug ist eine Tabelle, die einen Fremdschlüssel definiert, der auf dieselbe Tabelle verweist. Das folgende Snippet zeigt beispielsweise einen Fremdschlüssel, mit dem erzwungen wird, dass die ManagerId eines Mitarbeiters auch ein Mitarbeiter ist.
GoogleSQL
CREATE TABLE Employees (
EmployeeId INT64 NOT NULL,
EmployeeName STRING(MAX) NOT NULL,
ManagerId INT64,
FOREIGN KEY (ManagerId) REFERENCES Employees (EmployeeId)
) PRIMARY KEY (EmployeeId);
PostgreSQL
CREATE TABLE Employees (
EmployeeId BIGINT NOT NULL,
EmployeeName VARCHAR NOT NULL,
ManagerId BIGINT,
FOREIGN KEY (ManagerId) REFERENCES Employees (EmployeeId),
PRIMARY KEY (EmployeeId)
);
Nächste Schritte
Weitere Informationen zur Unterstützung von Fremdschlüsseln in Spanner
Weitere Informationen zum INFORMATION SCHEMA von Spanner.