CONSTRAINT-Klausel (Microsoft Access SQL)

Gilt für: Access 2013, Office 2013

Eine Einschränkung ähnelt einem Index, obwohl sie auch zur Verknüpfung mit einer anderen Tabelle verwendet werden kann.

Verwenden Sie die CONSTRAINT-Klausel in den ALTER TABLE- und CREATE TABLE-Anweisungen, um Einschränkungen zu erstellen oder zu löschen. Es gibt zwei Arten von CONSTRAINT-Klauseln: eine zum Erstellen einer Einschränkung für ein einzelnes Feld oder zum Erstellen einer Einschränkung für mehrere Felder.

Hinweis

Die Datenbank-Engine von Microsoft Access unterstützt CONSTRAINT-Klauseln nicht, genauso wie DDL-Anweisungen mit Datenbank-Engine-Datenbanken, die nicht auf Microsoft Access basieren. Verwenden Sie stattdessen die Create-Methoden von DAO.

Syntax

Beschränkung für ein einzelnes Feld

CONSTRAINT name {PRIMARY KEY | UNIQUE | NOT NULL | REFERENCES foreigntable [(foreignfield1, foreignfield2)] [ON UPDATE CASCADE | SET NULL] [ON DELETE CASCADE | SET NULL]}

Einschränkung für mehrere Felder

CONSTRAINT name {PRIMARY KEY (primary1[, primary2 [, ...]]) | UNIQUE (unique1[, unique2 [, ...]]) | NOT NULL (notnull1[, notnull2 [, ...]]) | FOREIGN KEY [NO INDEX] (ref1[, ref2 [, ...]]) REFERENCES foreigntable [(foreignfield1 [, foreignfield2 [, ...]])] [ON UPDATE CASCADE | SET NULL] [ON DELETE CASCADE | SET NULL]}

Die CONSTRAINT-Klausel besteht aus diesen Teilen:

Part

Beschreibung

name

Der Name der Einschränkung, die erstellt werden soll.

Primärschlüssel1, Primärschlüssel2

Die Namen der Felder, die als Primärschlüssel gekennzeichnet werden sollen.

EindeutigesFeld1, EindeutigesFeld2

Der Name des Felds oder der Felder, die als Eindeutiger Schlüssel festgelegt werden.

NichtNULLFeld1, NichtNULLFeld2

Der Name des Felds/der Felder, die auf NULL ausschließende Werte eingeschränkt sind.

Bezug1, Bezug2

Die Namen fremder Felder, die sich auf Felder in anderen Tabellen beziehen.

Fremdtabelle

Der Name der fremden Tabelle, in der die Felder fremdesFeld enthalten sind.

Fremdfeld1, Fremdfeld2

Die Namen der Felder in fremdeTabelle, angegeben in ref1, ref2. Sie können die Klausel auslassen, wenn das referenzierte Feld der Primärschlüssel von fremdeTabelle ist.

Bemerkungen

Sie können die Syntax für die Einschränkung für ein einzelnes Feld in der Felddefinitionsklausel einer ALTER TABLE- oder CREATE TABLE-Anweisung unmittelbar im Anschluss an die Angabe des Datentyps des Felds verwenden.

Es handelt sich um eine Einschränkung für mehrere Felder, wenn das Schlüsselwort CONSTRAINT in einer ALTER TABLE- oder CREATE TABLE-Anweisung außerhalb einer Felddefinitionsklausel vorkommt.

Mit der Klausel CONSTRAINT können Sie ein Feld als einen der folgenden Ausnahmetypen kennzeichnen:

  • Mit dem reservierten Wort UNIQUE können Sie ein Feld als eindeutigen Schlüssel kennzeichnen. Das bedeutet, dass zwei Datensätze in dieser Tabelle in diesem Feld nicht denselben Wert haben dürfen. Sie können ein beliebiges Feld oder eine beliebige Anzahl von Feldern mit dieser Einschränkung belegen. Wird eine Einschränkung für mehrere Felder als eindeutiger Schlüssel gekennzeichnet, müssen lediglich die kombinierten Werte aller Felder eindeutig sein, auch wenn zwei oder mehr Datensätze denselben Wert in einem Feld aufweisen.

  • Mit dem reservierten Wort PRIMARY KEY können Sie ein Feld oder eine Auswahl von Feldern in einer Tabelle als Primärschlüssel kennzeichnen. Es ist nur ein eindeutiger Primärschlüssel pro Tabelle zulässig, der zudem nicht Null sein darf.

    Hinweis

    Legen Sie keine Einschränkung PRIMARY KEY für eine Tabelle fest, die bereits einen Primärschlüssel aufweist; andernfalls tritt ein Fehler auf.

  • Mit dem reservierten Word FOREIGN KEY können Sie ein Feld als fremden Schlüssel kennzeichnen. Wenn der Primärschlüssel der fremden Tabelle aus mehreren Felder besteht, müssen Sie eine Einschränkung für mehrere Felder definieren, in der alle referenzierten Felder, der Name der fremden Tabelle und die Namen der referenzierten Felder in der fremden Tabelle (in derselben Reihenfolge wie die referenzierten Felder) aufgeführt sind. Handelt es sich bei referenzierten Feldern um den Primärschlüssel der fremden Tabelle, müssen Sie die referenzierten Felder nicht angeben. Standardmäßig behandelt die Datenbank-Engine den Primärschlüssel der fremden Tabelle als referenzierte Felder. Einschränkungen für fremde Schlüssel legen bestimmte Aktionen fest, die durchgeführt werden, wenn sich der Wert des entsprechenden Primärschlüssels ändert:

  • Sie können Aktionen angeben, die für die Fremdtabelle ausgeführt werden sollen, basierend auf einer entsprechenden Aktion, die für einen Primärschlüssel in der Tabelle ausgeführt wird, für die constraint definiert ist. Betrachten Sie beispielsweise die folgende Definition für die Tabelle Customers:

      CREATE TABLE Customers (CustId INTEGER PRIMARY KEY, CLstNm NCHAR VARYING (50))
    

    Betrachten Sie die folgende Definition der Tabelle "Orders", bei eine Verknüpfung mit einem fremden Schlüssel erstellt wird, die den Primärschlüssel der Tabelle "Customers" referenziert:

      CREATE TABLE Orders (OrderId INTEGER PRIMARY KEY, CustId INTEGER, OrderNotes NCHAR VARYING (255), CONSTRAINT FKOrdersCustId FOREIGN KEY (CustId) REFERENCES Customers ON UPDATE CASCADE ON DELETE CASCADE
    

    Für den fremden Schlüssel wurde sowohl eine ON UPDATE CASCADE- als eine ON DELETE CASCADE-Klausel definiert. Mit der ON UPDATE CASCADE-Klausel wird die Kundennummer (CustId) bei Änderung in der Tabelle "Customers" and die Tabelle "Orders" weitergegeben. Jeder Auftrag mit der entsprechenden Kundennummer als Wert wird automatisch durch die neue Kundennummer aktualisiert. Mit der ON DELETE CASCADE-Klausel werden für einen Kunde, der in der Tabelle "Customers" gelöscht wurde, in der Tabelle "Orders" alle Zeilen mit dieser Kundennummer gelöscht. Betrachten Sie die abweichende Definition der Tabelle "Orders", bei der anstelle der CASCADE-Aktion die Aktion SET NULL verwendet wird:

      CREATE TABLE Orders (OrderId INTEGER PRIMARY KEY, CustId INTEGER, OrderNotes NCHAR VARYING (255), CONSTRAINT FKOrdersCustId FOREIGN KEY (CustId) REFERENCES Customers ON UPDATE SET NULL ON DELETE SET NULL
    

    Mit der ON UPDATE SET NULL-Klausel werden bei Änderung der Kundennummer (CustId) in der Tabelle "Customers" die entsprechenden Werte in der fremden Tabelle "Orders" automatisch auf "NULL" gesetzt. Dementsprechend werden bei der ON DELETE SET NULL-Klausel alle fremden Schlüssel in der Tabelle "Orders" automatisch auf NULL gesetzt, sobald der Kunde in der Tabelle "Customers" gelöscht wird.

Um die automatische Erstellung von Indizes für Fremdschlüssel zu verhindern, kann der NO INDEX-Modifizierer verwendet werden. Diese Art der Fremdschlüsseldefinition sollte nur in Fällen verwendet werden, bei denen sich ergebenden Indexwerte häufig dupliziert würden. Werden fremde Indexwerte häufig dupliziert, ist ein Index möglichweise ineffizienter als ein ein Tabellenscan. Durch diese Art der Indizierung, bei der Zeilen eingefügt und aus der Tabelle gelöscht werden, beeinträchtigt die Leistung und bietet keinerlei Vorteile.

Beispiel

In diesem Beispiel wird eine neue Tabelle namens "ThisTable" mit zwei Textfeldern erstellt.

 Sub CreateTableX1()    
Dim dbs As Database 
 
    ' Modify this line to include the path to Northwind 
    ' on your computer. 
    Set dbs = OpenDatabase("Northwind.mdb") 
 
    ' Create a table with two text fields. 
    dbs.Execute "CREATE TABLE ThisTable " _ 
        & "(FirstName CHAR, LastName CHAR);" 
 
    dbs.Close 
 
End Sub

Bei diesem Beispiel wird eine neue Tabelle mit dem Namen "myTable" und zwei Textfeldern erstellt: einem Datums-/Uhrzeitfeld und einen eindeutigen Index, der aus allen drei Feldern besteht.

    Sub CreateTableX2() 
     
        Dim dbs As Database 
     
        ' Modify this line to include the path to Northwind 
        ' on your computer. 
     
        Set dbs = OpenDatabase("Northwind.mdb") 
     
        ' Create a table with three fields and a unique 
        ' index made up of all three fields. 
        dbs.Execute "CREATE TABLE MyTable " _ 
            & "(FirstName CHAR, LastName CHAR, " _ 
            & "DateOfBirth DATETIME, " _ 
            & "CONSTRAINT MyTableConstraint UNIQUE " _ 
            & "(FirstName, LastName, DateOfBirth));" 
     
        dbs.Close 
     
    End Sub

Im folgenden Beispiel wird eine neue Tabelle mit zwei Textfeldern und einem Feld vom Typ Integer erstellt. Das Feld "SSN" ist der Primärschlüssel.

    Sub CreateTableX3() 
     
         Dim dbs As Database 
     
        ' Modify this line to include the path to Northwind 
        ' on your computer. 
        Set dbs = OpenDatabase("Northwind.mdb") 
     
        ' Create a table with three fields and a primary 
        ' key. 
        dbs.Execute "CREATE TABLE NewTable " _ 
            & "(FirstName CHAR, LastName CHAR, " _ 
            & "SSN INTEGER CONSTRAINT MyFieldConstraint " _ 
            & "PRIMARY KEY);" 
     
        dbs.Close 
     
    End Sub