Auf Englisch lesen

Freigeben über


Definieren von Beziehungen zwischen Tabellen mit Access SQL

Beziehungen sind die gängigen Zuordnungen zwischen zwei oder mehr Tabellen. Beziehungen basieren auf allgemeinen Feldern von mehr als einer Tabelle, wobei häufig Primärschlüssel oder Fremdschlüssel beteiligt sind.

Bei einem Primärschlüssel handelt es sich um das Feld (oder die Felder), das verwendet wird, um jeden Datensatz in einer Tabelle eindeutig zu identifizieren. Ein Primärschlüssel muss drei Anforderungen erfüllen: Er kann nicht den Wert Null aufweisen, er muss eindeutig sein, und es kann nur ein Schlüssel pro Tabelle definiert sein. Sie können einen Primärschlüssel definieren, indem Sie einen Index für einen Primärschlüssel erstellen oder die Klausel CONSTRAINT in der Tabellendeklaration verwenden, wie in den Beispielen weiter unten in diesem Abschnitt gezeigt. Eine Einschränkung schränkt die Werte ein, die in ein Feld eingegeben werden.

Ein Fremdschlüssel ist ein Feld (oder Felder) in einer Tabelle, die auf einen Primärschlüssel in einer anderen Tabelle verweisen. Die Daten in den Feldern aus beiden Tabellen sind genau gleich, und die Tabelle mit dem Primärschlüssel-Datensatz (die Primärtabelle) muss über die vorhandenen Datensätze verfügen, bevor die Tabelle mit dem Fremdschlüssel-Datensatz (die Fremdtabelle) über die passenden oder verwandten Datensätze verfügt. Wie Primärschlüssel können Sie auch Fremdschlüssel in der Tabellendeklaration definieren, indem Sie die Klausel CONSTRAINT verwenden.

Es gibt im Wesentlichen drei Arten von Beziehungen:

  • 1:1-Beziehung Für jeden Datensatz in der Primärtabelle gibt es nur einen einzigen Datensatz in der Fremdtabelle.
  • 1:n-Beziehung Für jeden Datensatz in der Primärtabelle gibt es einen oder mehr Datensätze in der Fremdtabelle.
  • n:n-Beziehung Für jeden Datensatz in der Primärtabelle gibt es viele Datensätze in der Fremdtabelle, und für jeden Datensatz in der Fremdtabelle gibt es viele verwandte Datensätze in der Primärtabelle.

Sie möchten beispielsweise einer Rechnungsdatenbank eine Rechnungstabelle hinzufügen. Für jeden Kunden in Ihrer Kundentabelle kann es viele Rechnungen in der Rechnungstabelle geben - dabei handelt es sich um ein klassisches 1:n-Szenario. Sie können den Primärschlüssel aus der Kundentabelle entnehmen und ihn in der Rechnungstabelle als Fremdschlüssel definieren, wodurch die richtige Beziehung zwischen den Tabellen hergestellt wird.

Wenn Sie die Beziehungen zwischen Tabellen definieren, müssen Sie die CONSTRAINT-Deklarationen auf Feldebene vornehmen. Dies bedeutet, dass die Einschränkungen in einer CREATE TABLE-Anweisung definiert werden. Verwenden Sie nach der Deklaration das CONSTRAINT -Schlüsselwort, benennen Sie die Einschränkung und die Tabelle, auf die es verweist sowie die Namen des Felds oder der Felder in der Tabelle, die den passenden Fremdschlüssel beinhaltet, um die Einschränkungen anzuwenden.

Die folgende Anweisung setzt voraus, dass die Tabelle tblCustomers bereits erstellt wurde und dafür ein Primärschlüssel im Feld CustomerID definiert wurde. Durch die Anweisung wird nun die Tabelle tblInvoices erstellt und deren Primärschlüssel im Feld InvoiceID definiert. Es wird zudem eine 1:1-Beziehung zwischen den Tabellen tblCustomers und tblInvoices erstellt, indem ein anderes CustomerID-Feld in der Tabelle tblInvoices definiert wird. Dieses Feld ist als Fremdschlüssel definiert, der auf das CustomerID-Feld in der Tabelle Kunden verweist. Beachten Sie, dass auf den Namen der einzelnen Einschränkungen das Schlüsselwort CONSTRAINT folgt.

CREATE TABLE tblInvoices  
    (InvoiceID INTEGER CONSTRAINT PK_InvoiceID PRIMARY KEY, 
    CustomerID INTEGER NOT NULL CONSTRAINT FK_CustomerID  
        REFERENCES tblCustomers (CustomerID), 
    InvoiceDate DATETIME, 
    Amount CURRENCY) 

Beachten Sie, dass der Primärschlüsselindex (PK_InvoiceID) für die Rechnungstabelle in der Anweisung CREATE TABLE deklariert ist. Um die Leistung des Primärschlüssels zu verbessern, wird automatisch ein Index für ihn erstellt, daher ist es nicht erforderlich, eine separate CREATE INDEX-Anweisung zu erstellen. Erstellen Sie nun eine Tabelle für den Versand, die die Lieferadressen aller Kunden enthält. Angenommen, es gibt nur einen Versanddatensatz für jeden Kundendatensatz, sodass Sie eine 1:1-Beziehung einrichten.

CREATE TABLE tblShipping  
    (CustomerID INTEGER CONSTRAINT PK_CustomerID PRIMARY KEY 
        REFERENCES tblCustomers (CustomerID), 
    Address TEXT(50), 
    City TEXT(50), 
    State TEXT(2), 
    Zip TEXT(10)) 

Beachten Sie, dass das CustomerID-Feld sowohl der Primärschlüssel für die Tabelle für den Versand als auch der Fremdschlüsselverweis für die Tabelle Kunden darstellt.

Einschränkungen

Einschränkungen können verwendet werden, um Primärschlüssel zu erstellen, referenzielle Integrität herzustellen und Werte einzugrenzen, die in ein Feld eingefügt werden können. Im Allgemeinen können Einschränkungen verwendet werden, um die Integrität und die Konsistenz der Daten in der Datenbank zu erhalten.

Es gibt zwei Typen von Einschränkungen: eine Einzelfeldeinschränkung bzw. Einschränkung auf Feldebene und eine Mehrfachfeldeinschränkung bzw. Einschränkung auf Tabellenebene. Beide Arten von Einschränkungen können in der Anweisung CREATE TABLE oder ALTER TABLE verwendet werden.

Eine Einzelfeldeinschränkung, auch Einschränkung auf Spaltenebene genannt, wird durch das Feld selbst deklariert, nachdem der Feld- und der Datentyp deklariert wurden. Verwenden Sie die Tabelle Kunden und erstellen Sie einen Einzelfeld-Primärschlüssel im CustomerID-Feld. Wenn Sie die Einschränkung hinzufügen möchten, verwenden Sie das Schlüsselwort CONSTRAINT mit dem Namen des Felds.

ALTER TABLE tblCustomers 
   ALTER COLUMN CustomerID INTEGER 
   CONSTRAINT PK_tblCustomers PRIMARY KEY 

Beachten Sie, dass der Name der Einschränkung vorgegeben ist. Sie können eine Verknüpfung verwenden, um den Primärschlüssel zu deklarieren, der die CONSTRAINT-Klausel vollkommen auslässt.

ALTER TABLE tblCustomers 
   ALTER COLUMN CustomerID INTEGER PRIMARY KEY 

Die Verknüpfungsmethode führt jedoch dazu, dass von Access zufällig ein Name für die Einschränkung generiert wird, was es erschwert, im Code darauf zu verweisen. Es ist eine gute Idee, ihre Einschränkungen immer zu benennen.

Verwenden Sie zum Löschen einer Einschränkung die DROP CONSTRAINT-Klausel mit der ALTER TABLE-Anweisung, und geben Sie den Namen der Einschränkung an.

ALTER TABLE tblCustomers 
   DROP CONSTRAINT PK_tblCustomers 

Einschränkungen können auch verwendet werden, um die zulässigen Werte für ein Feld zu begrenzen. Sie können Werte auf NOT NULL oder UNIQUE beschränken oder Sie können eine CHECK-Einschränkung definieren, wobei es sich um eine Art Business-Regel handelt, die auf ein Feld angewendet werden kann. Angenommen, Sie möchten die Werte so einschränken, dass die Felder für den Vor- und den Nachnamen eindeutig sind, was bedeutet, dass es keine Kombination aus Vor- und Nachnamen geben sollte, die für jegliche zwei Datensätze in der Tabelle identisch sind. Da es sich hier um eine Mehrfachfeldeinschränkung handelt, ist sie auf Tabellenebene deklariert und nicht auf der Feldebene. Verwenden Sie die ADD CONSTRAINT -Klausel und definieren Sie eine Mehrfachfeldliste.

ALTER TABLE tblCustomers 
   ADD CONSTRAINT CustomerID UNIQUE 
   ([Last Name], [First Name]) 

Eine CHECK-Einschränkung ist ein leistungsstarkes SQL-Feature, mit dem Sie einer Tabelle eine Datenprüffunktion hinzufügen können, indem Sie einen Ausdruck erstellen, der auf ein einzelnes Feld oder mehrere Felder in einer oder mehreren Tabellen verweisen kann. Angenommen, Sie möchten sicherstellen, dass die in einen Rechnungsdatensatz eingegebenen Beträge immer höher als 0,00 $ sind. Zu diesem Zweck verwenden Sie eine CHECK-Einschränkung, indem Sie das CHECK-Schlüsselwort und den Prüfausdruck in der Klausel ADD CONSTRAINT einer ALTER TABLE-Anweisung deklarieren.

ALTER TABLE tblInvoices 
   ADD CONSTRAINT CheckAmount 
   CHECK (Amount > 0) 

Der zum Definieren einer CHECK-Einschränkung verwendete Ausdruck kann auch auf mehr als ein Feld in derselben Tabelle verweisen oder auf Felder in anderen Tabellen. Er kann Vorgänge verwenden, die in Access SQL gültig sind, wie beispielsweise die SELECT-Anweisung, mathematische Operatoren und Aggregatfunktionen. Der Ausdruck, der die CHECK-Einschränkung definiert, kann nicht länger als 64 Zeichen sein.

Angenommen, Sie möchten das Kreditlimit jedes Kunden prüfen, bevor er in die Tabelle Kunden aufgenommen wird. Verwenden Sie eine ALTER TABLE-Anweisung mit den Klauseln ADD COLUMN und CONSTRAINT, um eine Einschränkung zu erstellen, die den Wert in der Tabelle Kreditlimit überprüft und das Kreditlimit des Kunden verifiziert. Verwenden Sie die folgenden SQL-Anweisungen, um die Tabelle tblCreditLimit zu erstellen, fügen Sie das Feld "CustomerLimit" zu der Tabelle tblCustomers hinzu, fügen Sie die Check-Einschränkung zu der Tabelle tblCustomers hinzu und testen Sie die Check-Einschränkung.

CREATE TABLE tblCreditLimit ( 
   Limit DOUBLE) 
 
INSERT INTO tblCreditLimit 
   VALUES (100) 
 
ALTER TABLE tblCustomers 
   ADD COLUMN CustomerLimit DOUBLE 
 
ALTER TABLE tblCustomers 
   ADD CONSTRAINT LimitRule 
   CHECK (CustomerLimit <= (SELECT Limit 
      FROM tblCreditLimit)) 
 
UPDATE TABLE tblCustomers 
   SET CustomerLimit = 200 
   WHERE CustomerID = 1 

Beachten Sie, dass beim Ausführen der UPDATE TABLE-Anweisung die Meldung ausgegeben wird, dass das Update nicht erfolgreich war, da die CHECK-Einschränkung verletzt wurde. Wenn Sie das Feld "CustomerLimit" auf einen Wert kleiner oder gleich 100 aktualisieren, wird das Update erfolgreich ausgeführt.

Support und Feedback

Haben Sie Fragen oder Feedback zu Office VBA oder zu dieser Dokumentation? Unter Office VBA-Support und Feedback finden Sie Hilfestellung zu den Möglichkeiten, wie Sie Support erhalten und Feedback abgeben können.