Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SAP Sybase SQL Anywhere 16.0 (Deutsch) » SQL Anywhere Server - SQL-Benutzerhandbuch » Tabellen, Ansichten und Indizes » Fremdschlüssel

 

Fremdschlüssel erstellen (SQL)

In Interactive SQL können Sie Fremdschlüssel mit den Anweisungen CREATE TABLE und ALTER TABLE erstellen und bearbeiten. Mit diesen Anweisungen können Sie viele Tabellenattribute einstellen, einschließlich Spaltenintegritätsregeln und Prüfungen.

Voraussetzungen

Welche Privilegien zum Erstellen eines Fremdschlüssels erforderlich sind, hängt davon ab, wer Tabelleneigentümer ist. Es gilt Folgendes:

  • Sie sind Eigentümer der referenzierten (Primärschlüssel) und referenzierenden (Fremdschlüssel) Tabelle.   Sie benötigen keine Privilegien.

  • Sie sind Eigentümer der referenzierenden Tabelle, jedoch nicht der referenzierten Tabelle.   Sie benötigen entweder das REFERENCES-Privileg für die Tabelle oder das CREATE ANY INDEX-Systemprivileg oder das CREATE ANY OBJECT-Systemprivileg.

  • Sie sind Eigentümer der referenzierten Tabelle, jedoch nicht der referenzierenden Tabelle.  

    • Sie benötigen entweder das ALTER ANY OBJECT-Systemprivileg oder das ALTER ANY TABLE-Systemprivileg.
    • Oder Sie müssen das ALTER-Privileg für die Tabelle haben sowie das COMMENT ANY OBJECT-Systemprivileg, das CREATE ANY OBJECT-Systemprivileg oder das CREATE ANY TABLE-Systemprivileg.
    • Außerdem müssen Sie das SELECT-Privileg für die Tabelle oder das SELECT ANY TABLE-Systemprivileg haben.

  • Sie sind bei keiner Tabelle Eigentümer.  

    • Sie benötigen entweder das REFERENCES-Privileg für die Tabelle oder das CREATE ANY INDEX-Systemprivileg oder das CREATE ANY OBJECT-Systemprivileg.
    • Sie benötigen entweder das ALTER ANY OBJECT-Systemprivileg oder das ALTER ANY TABLE-Systemprivileg.
    • Oder Sie müssen das ALTER-Privileg für die Tabelle haben sowie das COMMENT ANY OBJECT-Systemprivileg, das CREATE ANY OBJECT-Systemprivileg oder das CREATE ANY TABLE-Systemprivileg.
    • Außerdem müssen Sie das SELECT-Privileg für die Tabelle oder das SELECT ANY TABLE-Systemprivileg haben.

Sie müssen das SELECT-Privileg für die Tabelle oder das SELECT ANY TABLE-Systemprivileg haben.

Außerdem müssen Sie Eigentümer der Tabelle sein oder eines der folgenden Privilegien haben:

  • ALTER-Privileg für die Tabelle sowie entweder das COMMENT ANY OBJECT-Systemprivileg, das CREATE ANY OBJECT-Systemprivileg oder das CREATE ANY TABLE-Systemprivileg.
  • ALTER ANY TABLE-Systemprivileg
  • ALTER ANY OBJECT-Systemprivileg

Kontext und Bemerkungen

Es ist nicht erforderlich, beim Erstellen einer Fremdtabelle einen Fremdschlüssel zu erstellen. Der Fremdschlüssel wird automatisch erstellt.

 Aufgabe
  1. Stellen Sie eine Verbindung mit der Datenbank her.

  2. Führen Sie eine ALTER TABLE-Anweisung ähnlich der folgenden aus:

    ALTER TABLE table-name ADD FOREIGN KEY foreign-key-name 
    ( column-name ASC ) REFERENCES table-name ( column-name )

Ergebnisse

Die Definition der Tabelle wird aktualisiert, um die Fremdschlüsseldefinition einzubeziehen.

Beispiel

Im folgenden Beispiel erstellen Sie eine Tabelle namens "Skills", die eine Liste möglicher Kompetenzen enthält. Anschließend erstellen Sie eine Tabelle namens "EmployeeSkills", die eine Fremdschlüsselbeziehung zur Tabelle "Skills" hat. Beachten Sie, dass "EmployeeSkills.SkillID" eine Fremdschlüsselbeziehung mit der Primärschlüsselspalte (Id) der Tabelle "Skills" hat.



CREATE TABLE Skills (
   Id INTEGER PRIMARY KEY,
   SkillName CHAR(40),
   Description CHAR(100) 
);
CREATE TABLE EmployeeSkills (
   EmployeeID INTEGER NOT NULL,
   SkillID INTEGER NOT NULL,
   SkillLevel INTEGER NOT NULL,
   PRIMARY KEY( EmployeeID ),
   FOREIGN KEY (SkillID) REFERENCES Skills ( Id )
);

Sie können einer Tabelle auch einen Fremdschlüssel hinzufügen, nachdem sie erstellt wurde, indem Sie die Anweisung ALTER TABLE benutzen. Im folgenden Beispiel erstellen Sie Tabellen ähnlich wie im vorherigen Beispiel, nur fügen Sie jetzt den Fremdschlüssel erst nach dem Erstellen der Tabelle hinzu.



CREATE TABLE Skills2 (
   ID INTEGER PRIMARY KEY,
   SkillName CHAR(40),
   Description CHAR(100) 
);
CREATE TABLE EmployeeSkills2 (
   EmployeeID INTEGER NOT NULL,
   SkillID INTEGER NOT NULL,
   SkillLevel INTEGER NOT NULL,
   PRIMARY KEY( EmployeeID ),
);
ALTER TABLE EmployeeSkills2
   ADD FOREIGN KEY SkillFK ( SkillID )
   REFERENCES Skills2 ( ID );

Sie können Eigenschaften für den Fremdschlüssel festlegen, wenn Sie ihn erstellen. Mit der folgenden Anweisung wird z.B. derselbe Fremdschlüssel erstellt wie in Beispiel 2, aber er wird als NOT NULL definiert und erhält Einschränkungen für die Aktualisierung und das Löschen von Daten.

ALTER TABLE Skills2
ADD NOT NULL FOREIGN KEY SkillFK ( SkillID )
REFERENCES Skills2 ( ID )
ON UPDATE RESTRICT
ON DELETE RESTRICT;

Namen für Fremdschlüsselspalten werden den Namen für Primärschlüsselspalten immer entsprechend der Position in den beiden Listen zugeordnet. Wenn die Spaltennamen der Primärtabelle bei der Festlegung des Fremdschlüssels nicht angegeben werden, dann werden die Primärschlüsselspalten verwendet. Nehmen wir beispielsweise an, dass Sie zwei Tabellen folgendermaßen erstellen:

CREATE TABLE Table1( a INT, b INT, c INT, PRIMARY KEY ( a, b ) );
CREATE TABLE Table2( x INT, y INT, z INT, PRIMARY KEY ( x, y ) );

Anschließend erstellen Sie einen Fremdschlüssel fk1, indem Sie genau angeben, wie die Spalten zwischen den Tabellen gepaart werden sollen, und zwar folgendermaßen:

ALTER TABLE Table2 ADD FOREIGN KEY fk1( x,y ) REFERENCES Table1( a, b );

Unter Verwendung der folgenden Anweisung erstellen Sie einen zweiten Fremdschlüssel fk2, indem Sie nur die Fremdtabellenspalten angeben. Der Datenbankserver paart automatisch diese zwei Spalten mit den ersten zwei Spalten im Primärschlüssel der Primärtabelle.

ALTER TABLE Table2 ADD FOREIGN KEY fk2( x, y ) REFERENCES Table1;

Unter Verwendung der folgenden Anweisung erstellen Sie einen Fremdschlüssel, ohne die Primär- oder die Fremdtabelle anzugeben:

ALTER TABLE Table2 ADD FOREIGN KEY fk3 REFERENCES Table1;

Da Sie keine referenzierenden Spalten angegeben haben, sucht der Datenbankserver nach Spalten in der Fremdtabelle (Table2) mit demselben Namen wie Spalten in der Primärtabelle (Table1). Wenn sie vorhanden sind, stellt der Datenbankserver sicher, dass die Datentypen übereinstimmen und erstellt dann den Fremdschlüssel unter Verwendung dieser Spalten. Wenn keine Spalten vorhanden sind, werden sie in Table2 erstellt. In diesem Beispiel hat Table2 keine Spalten namens a und b, daher werden sie mit denselben Datentypen wie Table1.a und Table1.b erstellt. Diese automatisch erstellten Spalten können nicht Teil des Primärschlüssels der Fremdtabelle werden.


 Siehe auch