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

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - SQL-Referenzhandbuch » Verwendung von SQL » SQL-Anweisungen » SQL-Anweisungen (A-D)

 

CREATE TABLE-Anweisung

Mit dieser Anweisung erstellen Sie eine neue Tabelle in der Datenbank und optional eine Tabelle auf einem Fremdserver.

Syntax
CREATE [ GLOBAL TEMPORARY ] TABLE [ IF NOT EXISTS ] [ Eigentümer.]Tabellenname
( { Spaltendefinition | Tabellen-Integritätsregel | pztfrei }, ... )
[ { IN | ON } DBSpace-Name ]
[ ENCRYPTED ]
[ ON COMMIT { DELETE | PRESERVE } ROWS
   | NOT TRANSACTIONAL ]
[ AT Standort_Zeichenfolge ]
[ SHARE BY ALL ]
Spaltendefinition :
Spaltenname Datentyp 
[ COMPRESSED ]
[ INLINE { Inline_Länge | USE DEFAULT } ]
[ PREFIX { Präfix_Länge | USE DEFAULT } ]
[ [ NO ] INDEX ]
[ [ NOT ] NULL ]
[ DEFAULT Standardwert | IDENTITY ]
[ Spalten_Integritätsregel ... ]
Standardwert :
 Spezialwert
| Zeichenfolge
| globale_Variable
| [ - ] Nummer
| ( Konstantenausdruck )
| integrierte_Funktion( Konstantenausdruck )
| AUTOINCREMENT
| CURRENT DATABASE
| CURRENT REMOTE USER
| CURRENT UTC TIMESTAMP
| GLOBAL AUTOINCREMENT [ ( Partitionsgröße ) ]
| NULL
| TIMESTAMP
| UTC TIMESTAMP
| LAST USER
Spezialwert:
CURRENT { 
   DATE 
   | TIME 
   | TIMESTAMP
   | UTC TIMESTAMP 
   | USER 
   | PUBLISHER 
}
| USER
Spalten_Integritätsregel :
[ CONSTRAINT Integritätsregelname ] {
   UNIQUE [ CLUSTERED ]
  | PRIMARY KEY [ CLUSTERED ] [ ASC | DESC ]
  | REFERENCES Tabellenname [ ( Spaltenname ) ] 
     [ MATCH [ UNIQUE ] { SIMPLE | FULL } ] 
     [ Aktionen ] [ CLUSTERED ] 
   }
| [ CONSTRAINT Integritätsregelname ] CHECK ( Bedingung )
| COMPUTE ( Ausdruck )
Tabellen-Integritätsregel :
[ CONSTRAINT Integritätsregelname ] {
     UNIQUE [ CLUSTERED ] ( Spaltenname [ ASC | DESC ], ... ) 
  | PRIMARY KEY [ CLUSTERED ] ( Spaltenname [ ASC | DESC ], ... ) 
  | CHECK ( Bedingung )
  | Fremdschlüssel_Integritätsregel
}
Fremdschlüssel_Integritätsregel :
[ NOT NULL ] FOREIGN KEY [ Rollenname ] 
   [ ( Spaltenname [ ASC | DESC ], ... ) ] 
   REFERENCES Tabellenname 
   [ ( Spaltenname, ... ) ] 
   [ MATCH [ UNIQUE] { SIMPLE | FULL } ]
   [ Aktionen ] [ CHECK ON COMMIT ] [ CLUSTERED ] [ FOR OLAP WORKLOAD ]
Aktionen : 
[ ON UPDATE Aktion ] 
[ ON DELETE Aktion ]
Aktion :
CASCADE | SET NULL | SET DEFAULT | RESTRICT
Standort-Zeichenfolge :
 Fremdservername.[DB-Name].[Eigentümer].Objektname
| Fremdservername;[DB-Name];[Eigentümer];Objektname
Pztfrei : PCTFREE Prozent_Freier_Speicherplatz
Prozent_Freier_Speicherplatz : Ganzzahl
Parameter
  • IN-Klausel   Verwenden Sie diese Klausel, um den DBSpace anzugeben, in dem sich die Basistabelle befindet. Wenn diese Klausel nicht angegeben ist, wird die materialisierte Ansicht in dem DBSpace erstellt, der in der Option default_dbspace angegeben wurde.

    Temporäre Tabellen können nur im DBSpace "temporary" erstellt werden. Wenn Sie eine GLOBAL TEMPORARY-Tabelle erstellen und IN angeben, wird die Tabelle im DBSpace TEMPORARY erstellt. Wenn Sie einen benutzerdefinierten DBSpace angeben, wird ein Fehler zurückgegeben.

    Weitere Hinweise zu DBSpaces finden Sie unter:

  • ENCRYPTED-Klausel   Die Klausel ENCRYPTED gibt an, dass die Tabelle verschlüsselt werden soll. Wenn Sie Tabellen verschlüsseln möchten, müssen Sie bei der Erstellung einer Datenbank die Tabellenverschlüsselung aktivieren. Die Verschlüsselung erfolgt unter Verwendung des Chiffrierschlüssels und des Algorithmus, die bei der Datenbankerstellung festgelegt wurden. Weitere Hinweise finden Sie unter Tabellenverschlüsselung in der Datenbank aktivieren.

  • ON COMMIT-Klausel   Die ON COMMIT-Klausel ist nur für temporäre Tabellen zulässig. Standardmäßig werden die Zeilen einer temporären Tabelle bei COMMIT gelöscht. Wenn die SHARE BY ALL-Klausel angegeben ist, muss entweder ON COMMIT PRESERVE ROWS oder NOT TRANSACTIONAL angegeben werden.

  • NOT TRANSACTIONAL-Klausel   Die NOT TRANSACTIONAL-Klausel ist zulässig, wenn Sie eine globale temporäre Tabelle erstellen. Eine mit NOT TRANSACTIONAL erstellte Tabelle wird weder durch COMMIT noch durch ROLLBACK verändert. Wenn die SHARE BY ALL-Klausel angegeben ist, muss entweder ON COMMIT PRESERVE ROWS oder NOT TRANSACTIONAL angegeben werden. Hinweise zu den Vorteilen der NOT TRANSACTIONAL-Klausel finden Sie unter Mit temporären Tabellen arbeiten.

  • AT-Klausel   Erstellt eine entfernte Tabelle auf einem anderen Server, der durch Standort_Zeichenfolge angegeben wird, wie auch eine Proxytabelle in der aktuellen Datenbank, die der entfernten Tabelle zugeordnet ist. Die AT-Klausel unterstützt das Semikolon (;) als Feldbegrenzer in Speicherort. Wenn kein Semikolon vorhanden ist, gilt der Punkt als Feldbegrenzer. Mit dieser Syntax können Dateinamen oder Erweiterungen in den Datenbank- und Eigentümerfeldern verwendet werden.

    Die folgende Anweisung ordnet die Tabelle a1 der Microsoft Access-Datei mydbfile.mdb zu:

    CREATE TABLE a1
    AT 'access;d:\mydbfile.mdb;;a1';

    Informationen zu Fremdservern finden Sie unter CREATE SERVER-Anweisung. Hinweise zu Proxytabellen finden Sie unter CREATE EXISTING TABLE-Anweisung und Standort von Proxytabellen angeben.

    Die AT-Klausel wird unter Windows Mobile nicht unterstützt.

    Fremdschlüsseldefinitionen werden in entfernten Tabellen ignoriert. Fremdschlüsseldefinitionen für lokale Tabellen, die entfernte Tabellen referenzieren, werden ebenfalls ignoriert. Primärschlüsseldefinitionen werden an den Fremdserver geschickt, wenn der Datenbankserver Primärschlüssel unterstützt.

  • SHARE BY ALL-Klausel   Verwenden Sie diese Klausel nur, wenn Sie globale temporäre Tabellen erstellen, um die Tabelle für alle Verbindungen zur Datenbank verfügbar zu machen. Wenn die SHARE BY ALL-Klausel angegeben ist, muss entweder ON COMMIT PRESERVE ROWS oder NOT TRANSACTIONAL angegeben werden.

    Weitere Informationen zu den Merkmalen von temporären Tabellen finden Sie unter Mit temporären Tabellen arbeiten.

  • IF NOT EXISTS-Klausel   Verwenden Sie diese Klausel, um permanente, globale temporäre und lokale temporäre Tabellen zu erstellen. Existiert die angegebene Tabelle bereits, werden keine Änderungen durchgeführt und keine Fehlermeldung ausgegben.

    Weitere Informationen zu den Merkmalen von temporären Tabellen finden Sie unter Mit temporären Tabellen arbeiten.

  • Spaltendefinition   Definiert eine Spalte in der Tabelle. Nachfolgend werden die Bestandteile von Spaltendefinitionen aufgeführt.

    • Spaltenname   Der Spaltenname ist ein Bezeichner. Mehrere Spalten in derselben Tabelle können nicht denselben Namen haben. Weitere Hinweise finden Sie unter Bezeichner.

    • Datentyp   Der in der Spalte gespeicherte Datentyp. Weitere Hinweise finden Sie unter SQL-Datentypen.

    • COMPRESSED   Komprimiert die Spalte. Beispiel: Die folgende Anweisung erstellt eine Tabelle t mit zwei Spalten: filename und contents. Die Spalte contents ist LONG BINARY und komprimiert:
      CREATE TABLE t ( 
        filename VARCHAR(255), 
        contents LONG BINARY COMPRESSED 
      );

  • INLINE- und PREFIX-Klauseln   Die INLINE-Klausel gibt in Byte die maximale BLOB-Größe an, die in einer Zeile gespeichert werden kann. BLOBs, die kleiner oder gleich dem in der INLINE-Klausel festgelegten Wert sind, werden in der Zeile gespeichert. BLOBs, die den in der INLINE-Klausel definierten Wert überschreiten, werden außerhalb der Zeile in Tabellenerweiterungsseiten gespeichert. Außerdem kann eine Kopie einiger Byte vom Beginn des BLOBs in der Zeile gespeichert werden, wenn ein BLOB größer als der INLINE-Wert ist. Verwenden Sie die PREFIX-Klausel, um anzugeben, wie viele Byte in der Zeile gehalten werden können. Die PREFIX-Klausel kann die Performance von Anforderungen verbessern, die die Präfixbyte eines BLOBs benötigen, um zu ermitteln, ob eine Zeile akzeptiert oder zurückgewiesen wird.

    Die Präfixdaten für eine komprimierte Spalte werden nicht komprimiert gespeichert, daher ist keine Dekomprimierung erforderlich, wenn alle Daten, die zur Erfüllung einer Anforderung erforderlich sind, im Präfix gespeichert sind.

    Wenn weder INLINE noch PREFIX angegeben sind, oder wenn USE DEFAULT angegeben ist, werden Standardwerte wie folgt angewendet:

    • Bei Spalten vom Zeichendaten-Typ wie CHAR, NCHAR und LONG VARCHAR ist der Standardwert für INLINE 256 und der Standardwert für PREFIX ist 8.

    • Bei Spalten vom Typ "Binärdaten" wie BINARY, LONG BINARY, VARBINARY, BIT, VARBIT, LONG VARBIT, BIT VARYING und UUID ist der Standardwert für INLINE "256" und der Standardwert für PREFIX "0".

      Hinweis

      Es wird dringend empfohlen, die Standardwerte zu verwenden, es sei denn, spezielle Umstände erfordern eine andere Einstellung. Die Standardwerte wurden ausgewählt, um die Performance und den Festplattenspeicherbedarf möglichst gut aneinander anzupassen. Wenn Sie z.B. INLINE auf einen großen Wert setzen und alle BLOBs in der Zeile gespeichert werden, kann sich die Performance bei der Zeilenverarbeitung verschlechtern. Wenn Sie PREFIX zu hoch einstellen, erhöhen Sie den erforderlichen Speicherplatz zum Speichern von BLOBs, da die PREFIX-Daten ein Duplikat eines BLOB-Abschnitts sind.

      Wenn nur ein Wert angegeben wird, wird der andere Wert automatisch auf die maximale Größe gesetzt, die nicht mit dem angegebenen Wert in Konflikt steht. Weder der INLINE- noch der PREFIX-Wert dürfen die Größe der Datenbankseite überschreiten. Auch gibt es in einer Tabellenseite eine geringe Menge an reserviertem Overhead, der nicht zum Speichern von Zeilendaten verwendet werden kann. Daher führt das Angeben eines INLINE-Werts, der fast die Größe der Datenbankseite erreicht, möglicherweise zu einer etwas niedrigeren Anzahl der in der Zeile gespeicherten Bytes.

  • INDEX- und NO INDEX-Klauseln   Wenn Sie BLOBs speichern (nur Zeichen- oder Binärdatentypen), geben Sie INDEX an, um BLOB-Indizes für eingefügte Werte zu erstellen, die den internen BLOB-Schwellenwert übersteigen (etwa acht Datenbankseiten). Dies ist die Standardeinstellung.

    BLOB-Indizes können die Performance verbessern, wenn Suchvorgänge mit wahlfreiem Zugriff innerhalb der BLOBs erforderlich sind. Allerdings kann bei BLOB-Werten wie Bildern und Multimediadateien, bei denen ein zufälliger Zugriff nicht erforderlich ist, die Performance gesteigert werden, wenn die BLOB-Indizierung abgeschaltet ist. Um die BLOB-Indizierung für eine Spalte zu deaktivieren, geben Sie NO INDEX ein.

    Hinweis

    Ein BLOB-Index unterscheidet sich von einem Tabellenindex. Ein Tabellenindex wird erstellt, um Werte in einer oder mehreren Spalten zu indizieren.

  • NULL- und NOT NULL-Klauseln   Wenn NULL angegeben ist, werden NULL-Werte in der Spalte zugelassen. Dies ist die Standardeinstellung.

    Wenn NOT NULL angegeben ist, werden NULL-Werte nicht zugelassen.

    Wenn die Spalte Teil einer UNIQUE- oder PRIMARY KEY-Integritätsregel ist, kann die Spalte keine NULL-Werte enthalten, auch wenn die NULL-Klausel angegeben wurde.

  • DEFAULT-Klausel   Weitere Hinweise zum Spezialwert finden Sie unter Spezialwerte.

    Wenn ein DEFAULT-Wert angegeben ist, wird er als Wert für die Spalte in jeder INSERT-Anweisung benutzt, die für diese Spalte keinen Wert angibt. Wenn kein DEFAULT-Wert angegeben wird, entspricht dies DEFAULT NULL.

    Die folgende Liste enthält mögliche Werte für DEFAULT:

    • Konstante Ausdrücke   Konstante Ausdrücke, die keine Datenbankobjekte referenzieren, sind in einer DEFAULT-Klausel zulässig. Daher können Funktionen wie GETDATE oder DATEADD verwendet werden. Wenn der Ausdruck keine Funktion oder kein einfacher Wert ist, muss er in Klammern eingeschlossen werden.

    • CURRENT REMOTE USER    Der Standardwert CURRENT REMOTE USER wird vom SQL Remote-Nachrichtenagenten (dbremote) definiert, wenn er die nicht dokumentierte REMOTE USER-Anweisung ausführt. Der Wert ist NULL, außer bei Verbindungen von DBREMOTE. Weitere Hinweise finden Sie unter Nachrichtenagent (dbremote).

    • AUTOINCREMENT   Wenn AUTOINCREMENT verwendet wird, muss die Spalte einer der Ganzzahl-Datentypen oder ein nummerisch exakter Typ sein.

      Ist beim Einfügen in die Tabelle kein Wert für die autoincrement-Spalte vorgegeben, wird ein eindeutiger Wert erstellt, der größer ist als alle Werte in der Spalte. Wenn INSERT einen Wert für die Spalte angibt, der größer ist als der derzeitige Höchstwert für die Spalte, so wird dieser Wert eingefügt und als Startpunkt für nachfolgende Einfügungen verwendet.

      Das Löschen von Zeilen setzt den AUTOINCREMENT-Zähler nicht herunter. Lücken durch gelöschte Zeilen können nur durch explizite Zuweisungen wieder gefüllt werden, wenn eine Einfügung verwendet wird. Nach der expliziten Einfügung eines Spaltenwerts unter dem Maximum werden nachfolgende Zeilen ohne explizite Zuordnung weiterhin automatisch mit einem um 1 höheren Wert als das vorherige Maximum erhöht.

      Sie können den zuletzt eingefügten Wert der Spalte herausfinden, indem Sie die globale Variable @@identity heranziehen. Weitere Hinweise finden Sie unter Globale Variable @@identity.

      AUTOINCREMENT-Werte werden als 64-Bit-Ganzzahlwerte mit Vorzeichen aufrecht erhalten, entsprechend dem Datentyp der max_identity-Spalte in der SYSTABCOL-Systemansicht. Wenn der nächste zu generierende Wert den Höchstwert überschreitet, der in der Spalte mit der AUTOINCREMENT-Zuordnung gespeichert werden kann, wird NULL zurückgegeben. Wenn in der Spalte NULL nicht zulässig ist, wie im Fall von Primärschlüsselspalten, wird ein SQL-Fehler generiert.

      Hinweise zum Neuaufbau von Datenbanken, die AUTOINCREMENT verwenden, finden Sie unter Tabellen mit Autoinkrement-Spalten neu laden.

    • IDENTITY-Klausel   Der IDENTITY-Standardwert ist eine Transact-SQL-kompatible Alternative zum AUTOINCREMENT-Standard. In SQL Anywhere wird eine als IDENTITY definierte Spalte als AUTOINCREMENT implementiert. Weitere Hinweise finden Sie unter Die spezielle IDENTITY-Spalte.

    • GLOBAL AUTOINCREMENT   Dieser Standardwert ist vorgesehen, wenn mehrere Datenbanken in einer MobiLink-Synchronisationsumgebung oder einer SQL Remote-Replikation verwendet werden.

      Diese Option ähnelt AUTOINCREMENT, außer dass die Domäne partitioniert ist. Jede Teilmenge enthält dieselbe Anzahl von Werten. Sie ordnen jeder Kopie der Datenbank eine eindeutige Datenbank-Identifizierungsnummer zu. SQL Anywhere liefert Standardwerte in einer Datenbank nur von der Partition, die eindeutig durch diese Datenbanknummer gekennzeichnet ist.

      Die Partitionsgröße kann unmittelbar nach dem Schlüsselwort AUTOINCREMENT in Klammern angegeben werden. Die Partitionsgröße kann jede positive Ganzzahl sein, obwohl dieser Wert normalerweise so eingeteilt wird, dass seine Größe kaum jemals überschritten werden kann.

      Wenn die Spalte vom Typ BIGINT oder UNSIGNED BIGINT ist, beträgt die Standard-Partitionsgröße 232 = 4294967296. Bei Spalten aller anderen Typen ist der Standardwert 216 = 65536. Da diese Standardwerte nicht immer sinnvoll sind, vor allem wenn die Spalte nicht vom Typ INT oder BIGINT ist, empfiehlt es sich, die Partitionsgröße explizit festzulegen.

      Wenn Sie diesen Standardwert verwenden, muss der Wert der öffentlichen Option global_database_id in jeder Datenbank auf eine eindeutige, nicht-negative Ganzzahl gesetzt werden. Dieser Wert kennzeichnet die Datenbank eindeutig und zeigt an, von welcher Partition Standardwerte zugeordnet werden sollen. Der Bereich der zulässigen Werte geht von np+ 1 bis p(n + 1), wobei n der Wert der öffentlichen Option global_database_id und p die Partitionsgröße ist. Wenn Sie z.B. die Partitionsgröße 1000 festlegen und global_database_id auf 3 gesetzt ist, liegt der Bereich zwischen 3001 und 4000.

      Wenn der vorherige Wert kleiner als p(n+ 1) ist, wird der nächste Standardwert um eins größer sein als der vorherige größte Wert in der Spalte. Wenn die Spalte keine Werte enthält, ist der erste Standardwert np + 1. Standardspaltenwerte sind von Werten, die sich außerhalb der aktuellen Partition befinden, nicht betroffen, d.h. von Nummern kleiner als np+ 1 oder größer als p(n + 1). Solche Werte können auftreten, wenn sie von einer anderen Datenbank über MobiLink oder SQL Remote repliziert wurden.

      Sie können den zuletzt eingefügten Wert der Spalte herausfinden, indem Sie die globale Variable @@identity heranziehen.

      GLOBAL AUTOINCREMENT-Werte werden als 64-Bit-Ganzzahlwerte mit Vorzeichen aufrecht erhalten, entsprechend dem Datentyp der max_identity-Spalte in der SYSTABCOL-Systemansicht. Wenn der Wertevorrat innerhalb der Partition aufgebraucht ist, wird NULL zurückgegeben. Wenn in der Spalte NULL nicht zulässig ist, wie im Fall von Primärschlüsselspalten, wird ein SQL-Fehler generiert. In diesem Fall sollte der Datenbank ein neuer global_database_id-Wert zugewiesen werden, damit Standardwerte aus einer anderen Partition gewählt werden können. Um festzustellen, ob der Vorrat von ungenutzten Werten zu Ende geht, und um diese Situation zu beheben, erstellen Sie ein Ereignis vom Typ GlobalAutoincrement. Weitere Hinweise finden Sie unter Definition von Ereignissen.

      Da die öffentliche Option global_database_id nicht auf einen negativen Wert gesetzt werden kann, sind die ausgewählten Werte immer positiv. Die maximale Identifizierungsnummer wird nur durch den Spaltendatentyp und die Partitionsgröße beschränkt.

      Wenn die öffentliche Option global_database_id auf den Standardwert 2147483647 gesetzt ist, wird NULL in die Spalte eingefügt. Falls NULL nicht zulässig ist, wird beim Versuch, die Zeile einzufügen, ein Fehler erzeugt.

  • TIMESTAMP-Klausel   Damit kann angezeigt werden, wann die einzelnen Zeilen in der Tabelle zuletzt geändert wurden. Ist eine Spalte mit DEFAULT TIMESTAMP deklariert, dann wird bei Einfügungen ein Standardwert bereitgestellt, und der Wert wird bei jeder Aktualisierung der Zeile mit Datum und Uhrzeit aktualisiert.

    Um einen Standardwert beim Einfügen bereitzustellen, die Spalte aber nicht bei jeder Zeilenaktualisierung zu aktualisieren, verwenden Sie DEFAULT CURRENT TIMESTAMP anstatt DEFAULT TIMESTAMP.

    Weitere Informationen zu Zeitstempelspalten finden Sie unter Spezielle timestamp-Spalten und timestamp-Datentypen in Transact-SQL.

    Spalten, die mit DEFAULT TIMESTAMP deklariert wurden, enthalten eindeutige Werte. Damit können Anwendungen fast gleichzeitige Aktualisierungen derselben Zeile ermitteln. Wenn der aktuelle timestamp-Wert mit dem letzten Wert übereinstimmt, wird er durch den Wert der Option default_timestamp_increment hochgezählt. Weitere Hinweise finden Sie unter default_timestamp_increment-Option [Datenbank] [MobiLink-Client].

    In SQL Anywhere können Sie timestamp-Werte automatisch kürzen, indem Sie die Option default_timestamp_increment verwenden. Dies ist hilfreich, wenn Sie die Kompatibilität mit anderen Datenbankprogrammen sicherstellen möchten, die timestamp-Werte weniger genau erfassen. Weitere Hinweise finden Sie unter default_timestamp_increment-Option [Datenbank] [MobiLink-Client].

    Die globale Variable @@dbts gibt einen TIMESTAMP-Wert zurück, der den zuletzt für eine Spalte mit DEFAULT TIMESTAMP generierten Wert repräsentiert. Weitere Hinweise finden Sie unter Globale Variable.

  • UTC TIMESTAMP-Klausel   Das Verhalten der UTC TIMESTAMP-Klausel ist gleich wie TIMESTAMP, mit der Ausnahme, dass ein UTC TIMESTAMP-Wert in Coordinated Universal-Zeit (UTC) angegeben ist.

  • Zeichenfolge   Weitere Hinweise finden Sie unter Zeichenfolgen.

  • Globale_Variable   Weitere Hinweise finden Sie unter Globale Variable.

  • Klauseln der Spalten-Integritätsregel und Tabellen-Integritätsregel   Spalten- und Tabellen-Integritätsregeln helfen, die Integrität der Daten in der Datenbank sicherzustellen. Wenn eine Anweisung die Verletzung einer Integritätsregel verursacht, wird die Ausführung der Anweisung abgebrochen, alle Änderungen, die gemacht wurden, seit der Fehler aufgetreten ist, werden rückgängig gemacht und ein Fehler wird protokolliert. Es können zwei Klassen von Integritätsregeln erstellt werden: Prüf-Integritätsregel und Regeln zur Erhaltung der referenziellen Integrität (RI). Prüf-Integritätsregeln werden verwendet, um Bedingungen anzugeben, die von Spaltenwerten, die in die Datenbank eingegeben werden, erfüllt werden müssen. RI-Integritätsregeln stellen eine Beziehung zwischen Daten in verschiedenen Tabellen her, die erhalten bleiben müssen, und geben überdies Eindeutigkeitsanforderungen für Daten an.

    Es gibt drei Arten von RI-Integritätsregeln: Primärschlüssel, Fremdschlüssel und Eindeutigkeits-Integritätsregeln. Wenn Sie eine RI-Integritätsregel (Primärschlüssel, Fremdschlüssel oder Eindeutigkeits-Integritätsregel) erstellen, erzwingt der Datenbankserver die Integritätsregel, indem er implizit einen Index für die Spalten erstellt, die den Schlüssel der Integritätsregel bilden. Der Index wird auf dem Schlüssel für die Integritätsregel, wie angegeben, erstellt. Ein Schlüssel besteht aus einer sortierten Spaltenliste und einer Reihenfolge der Werte (aufsteigend oder absteigend) für alle Spalten.

    Integritätsregeln können für Spalten oder Tabellen angegeben werden. Im Allgemeinen bezieht sich eine Spaltenintegritätsregel auf eine Spalte in einer Tabelle, während sich eine Tabellen-Integritätsregel auf eine oder mehrere Spalten in der Tabelle beziehen kann.

    • PRIMARY KEY-Integritätsregel   Ein Primärschlüssel definiert eindeutig jede Zeile in der Tabelle. Primärschlüssel umfassen eine oder mehrere Spalten. Eine Tabelle kann nicht mehr als einen Primärschlüssel besitzen. In einer Spaltenintegritätsregel-Klausel gibt die Verwendung von PRIMARY KEY an, dass die Spalte der Primärschlüssel für die Tabelle ist. In einer Tabellen-Integritätsregel-Klausel verwenden Sie die PRIMARY KEY-Klausel, um eine oder mehrere Spalten anzugeben, die, wenn sie in der angegebenen Reihenfolge kombiniert werden, den Primärschlüssel für die Tabelle darstellen.

      Die Reihenfolge der Spalten in einem Primärschlüssel muss nicht mit den entsprechenden Ordinalnummern der Spalte übereinstimmen. Das heißt, dass die Spalten in einem Primärschlüssel nicht dieselbe physische Reihenfolge in der Zeile haben müssen. Außerdem dürfen Sie keine doppelten Spaltennamen angeben.

      Wenn Sie einen Primärschlüssel erstellen, wird automatisch ein Index für den Schlüssel erstellt. Sie können die Reihenfolge der Werte in einem Index festlegen, indem Sie bei jeder Spalte ASC (ascending, aufsteigend) oder DESC (descending, absteigend) angeben. Sie können auch angeben, ob der Index gruppiert werden soll, indem Sie das Schlüsselwort CLUSTERED verwenden. Weitere Hinweise zur Option CLUSTERED und zu Clustered-Indizes finden Sie unter Clustered-Indizes verwenden.

      Spalten, die in Primärschlüsseln enthalten sind, können NULL nicht zulassen. Jede Zeile in der Tabelle besitzt einen eindeutigen Primärschlüsselwert.

      Es wird empfohlen, keine angenäherten Datentypen wie FLOAT und DOUBLE für Primärschlüssel zu verwenden. Bei angenäherten nummerischen Datentypen können nach arithmetischen Vorgängen Rundungsfehler auftreten.

    • Fremdschlüssel   Ein Fremdschlüssel beschränkt die Werte für eine Reihe von Spalten, sodass sie mit den Werten in einem Primärschlüssel oder einer Eindeutigkeits-Integritätsregel einer anderen Tabelle (der Primärtabelle) übereinstimmen. Eine Fremdschlüssel-Integritätsregel kann beispielsweise verwendet werden, um zu gewährleisten, dass eine Kundennummer in einer Rechnungstabelle mit der Kundennummer in der Customers-Tabelle übereinstimmt.

      Hinweise dazu, auf welche Weise der Datenbankserver Spalten automatisch für den Fremdschlüssel auswählen kann, finden Sie unter Spaltennamen bei der Erstellung von Fremdschlüsseln weglassen (SQL).

      Die Reihenfolge der Fremdschlüsselspalten muss nicht der Reihenfolge der Spalten in der Tabelle entsprechen.

      Doppelte Spaltennamen sind in der Fremdschlüsselangabe nicht zulässig.

      Die Standard-Aktion ist RESTRICT, wenn keine Aktion für einen UPDATE- oder DELETE-Vorgang angegeben ist.

      Wenn Sie einen Fremdschlüssel erstellen, wird automatisch ein Index für den Schlüssel erstellt. Sie können die Reihenfolge der Werte in einem Index festlegen, indem Sie bei jeder Spalte ASC (ascending, aufsteigend) oder DESC (descending, absteigend) angeben. Sie können auch angeben, ob der Index gruppiert werden soll, indem Sie das Schlüsselwort CLUSTERED verwenden. Weitere Hinweise zur Option CLUSTERED und zu Clustered-Indizes finden Sie unter Clustered-Indizes verwenden.

      Eine temporäre Tabelle kann keinen Fremdschlüssel besitzen, der eine Basistabelle referenziert, und eine Basistabelle kann keinen Fremdschlüssel besitzen, der eine temporäre Tabelle referenziert.

      • NOT NULL-Option   Lässt NULL nicht in den Fremdschlüsselspalten zu. NULL in einem Fremdschlüssel bedeutet, dass dieser Zeile in der Fremdtabelle keine Zeile in der Primärtabelle entspricht.

      • Rollenname-Klausel   Der Rollenname ist der Name des Fremdschlüssels. Die Hauptfunktion des Rollennamens liegt in der Unterscheidung von zwei Fremdschlüsseln für dieselbe Tabelle. Wenn kein Rollenname angegeben ist, wird der Rollenname wie folgt zugeordnet:

        1. Wenn es keinen Fremdschlüssel mit einem Rollennamen gibt, der genauso lautet wie der Tabellenname, wird der Tabellenname als Rollenname zugeordnet.

        2. Wenn der Tabellenname bereits vergeben ist, wird für den Rollennamen ein Tabellenname verwendet, der aus einer für diese Tabelle eindeutigen dreistelligen und mit vorangestellten Nullen versehenen Zahl zusammengesetzt ist.

      • REFERENCES-Klausel   Eine Fremdschlüssel-Integritätsregel kann mithilfe einer REFERENCES-Spaltenintegritätsregel (nur eine einzige Spalte) oder einer FOREIGN KEY-Tabellen-Integritätsregel implementiert werden, wobei die Integritätsregel eine oder mehrere Spalten angeben kann. Wenn Sie einen Spaltennamen in einer REFERENCES-Spaltenintegritätsregel angeben, muss es sich um eine Spalte in der Primärtabelle handeln. Diese muss einer Eindeutigkeits-Integritätsregel oder Primärschlüssel-Integritätsregel unterliegen, und diese Integritätsregel darf nur aus dieser einen Spalte bestehen. Wenn Sie keinen Spaltennamen angeben, referenziert die Fremdschlüsselspalte die einzelne Primärschlüsselspalte der Primärtabelle.

      • MATCH-Klausel   Mit der MATCH-Klausel können Sie steuern, was als eine Übereinstimmung gilt, wenn ein Mehrspalten-Fremdschlüssel verwendet wird. Sie ermöglicht es Ihnen auch, Eindeutigkeit für den Schlüssel anzugeben, wodurch sich ein separates Deklarieren der Eindeutigkeit erübrigt. Es folgt eine Liste der Übereinstimmungstypen, die Sie angeben können:

        • UNIQUE-Option   Die referenzierende Tabelle darf nur eine Übereinstimmung bei Nicht-NULL-Schlüsselwerten haben (Schlüssel mit mindestens einem Nicht-NULL-Wert sind implizit eindeutig).

        • SIMPLE-Option   Eine Übereinstimmung bei einer Zeile in der referenzierenden Tabelle tritt ein, wenn mindestens eine Spalte im Schlüssel NULL ist oder wenn alle Spaltenwerte mit den entsprechenden Spaltenwerten in einer Zeile der referenzierenden Tabelle übereinstimmen.

        • FULL-Option   Eine Übereinstimmung bei einer Zeile in der referenzierenden Tabelle tritt ein, wenn alle Spaltenwerte im Schlüssel NULL sind oder alle Spaltenwerte mit den Werten in einer Zeile der referenzierenden Tabelle übereinstimmen.

        • SIMPLE UNIQUE-Option   Eine Übereinstimmung tritt ein, wenn die Kriterien für SIMPLE und UNIQUE erfüllt werden.

        • FULL UNIQUE-Option   Eine Übereinstimmung tritt ein, wenn die Kriterien für FULL und UNIQUE erfüllt werden.

    • UNIQUE-Integritätsregel   In einer Spaltenintegritätsregel-Klausel gibt eine UNIQUE-Integritätsregel an, dass die Werte in der Spalte eindeutig sein müssen. In einer Tabellen-Integritätsregel-Klausel kennzeichnet die UNIQUE-Integritätsregel eine oder mehrere Spalten, die jede Zeile in der Tabelle eindeutig identifizieren. Es kann in einer Tabelle nicht mehrere Zeilen mit denselben Werten in der bzw. allen benannten Spalte(n) geben. Eine Tabelle kann mehr als eine UNIQUE-Integritätsregel besitzen.

      Eine UNIQUE-Integritätsregel unterscheidet sich von einem eindeutigen Index. Spalten mit einem eindeutigen Index lassen NULL zu, nicht aber Spalten in einer Eindeutigkeits-Integritätsregel. Auch kann ein Fremdschlüssel entweder einen Primärschlüssel oder eine UNIQUE-Integritätsregel referenzieren, aber keinen eindeutigen Index, da dieser mehrere Instanzen von NULL enthalten kann.

      Spalten in einer UNIQUE-Integritätsregel können in beliebiger Reihenfolge angegeben werden. Zusätzlich können Sie die Reihenfolge der Werte im entsprechenden Index, der automatisch erstellt wird, festlegen, indem Sie bei jeder Spalte ASC (ascending, aufsteigend) oder DESC (descending, absteigend) angeben. Sie dürfen allerdings keine doppelten Spaltennamen angeben.

      Es wird empfohlen, keine angenäherten Datentypen wie FLOAT und DOUBLE für Spalten mit Eindeutigkeits-Integritätsregeln zu verwenden. Bei angenäherten nummerischen Datentypen können nach arithmetischen Vorgängen Rundungsfehler auftreten.

      Sie können auch angeben, ob die Integritätsregel gruppiert werden soll, indem Sie das Schlüsselwort CLUSTERED verwenden. Weitere Hinweise zur CLUSTERED-Option finden Sie unter Clustered-Indizes verwenden.

      Informationen zu eindeutigen Indizes finden Sie unter CREATE INDEX-Anweisung.

    • CHECK-Integritätsregel   Diese Integritätsregel ermöglicht die Überprüfung beliebiger Bedingungen. Zum Beispiel kann mit einer CHECK-Integritätsregel gewährleistet werden, dass eine Spalte mit dem Namen Geschlecht nur die Werte M oder W enthält.

      Keine Zeile in einer Tabelle darf gegen eine CHECK-Integritätsregel verstoßen. Wenn eine INSERT- oder UPDATE-Anweisung dazu führen sollte, dass eine Zeile gegen die Integritätsregel verstößt, wird der Vorgang nicht zugelassen und die Auswirkungen der Anweisung werden rückgängig gemacht. Die Änderung wird nur zurückgewiesen, wenn die Bedingung für die CHECK-Integritätsregel FALSE ist. Dagegen ist die Änderung zulässig, wenn diese Bedingung TRUE oder UNKNOWN ist.

      Weitere Informationen zu TRUE-, FALSE- und UNKNOWN-Bedingungen finden Sie unter NULL und Suchbedingungen.

    • COMPUTE-Klausel   Die COMPUTE-Klausel ist nur zur Verwendung in einer Spalten-Integritätsregel-Klausel bestimmt. Wenn eine Spalte unter Verwendung einer COMPUTE-Klausel erstellt wurde, entspricht ihr Wert in jeder Zeile dem Wert des angegebenen Ausdrucks. Mit dieser Integritätsregel erstellte Spalten sind schreibgeschützte Spalten für Anwendungen: Der Wert wird vom Datenbankserver geändert, wenn die Zeile geändert wird. Der COMPUTE-Ausdruck darf keinen nicht deterministischen Wert zurückgeben. Er darf z.B. nicht einen Spezialwert wie CURRENT TIMESTAMP oder eine nicht deterministische Funktion enthalten. Wenn ein COMPUTE-Ausdruck einen nicht deterministischen Wert zurückgibt, kann er nicht verwendet werden, um eine Übereinstimmung in einer Abfrage zu suchen. Weitere Hinweise finden Sie unter Mit berechneten Spalten arbeiten.

      Die COMPUTE-Klausel wird für entfernte Tabellen ignoriert.

      Eine UPDATE-Anweisung, die versucht, den Wert einer berechneten Spalte zu ändern, löst alle Trigger aus, die mit der Spalte verbunden sind.

  • CHECK ON COMMIT-Option   Die CHECK ON COMMIT-Option hebt die Datenbankoption wait_for_commit auf und veranlasst den Datenbankserver, auf ein COMMIT zu warten, bevor er RESTRICT-Aktionen auf einen Fremdschlüssel überprüft. Die CHECK ON COMMIT-Option verzögert die Aktionen CASCADE, SET NULL oder SET DEFAULT nicht.

    Wenn Sie CHECK ON COMMIT ohne Angabe einer Aktion verwenden, wird RESTRICT als Aktion für UPDATE und DELETE angenommen.

  • FOR OLAP WORKLOAD-Option   Wenn Sie FOR OLAP WORKLOAD in der REFERENCES-Klausel einer Fremdschlüsseldefinition angeben, führt der Datenbankserver bestimmte Optimierungen durch und sammelt Statistiken, um die Verbesserung der Performance für OLAP-Arbeitslasten zu unterstützen, vor allem wenn optimization_workload auf OLAP gesetzt ist. Weitere Hinweise finden Sie unter optimization_workload-Option [Datenbank].

    Weitere Hinweise finden Sie unter OLAP-Unterstützung.

  • PCTFREE-Klausel   Gibt den Prozentsatz des freien Speicherplatzes an, der für jede Tabellenseite reserviert werden soll. Der freie Speicherplatz wird verwendet, wenn die Zeilen durch die Datenaktualisierung anwachsen. Wenn in einer Tabellenseite kein freier Speicherplatz verfügbar ist, führt jede Vergrößerung einer Zeile dieser Seite zu einer Aufteilung der Zeile auf mehrere Tabellenseiten, was Zeilenfragmentierung und eventuell Performanceverlust nach sich zieht.

    Der Wert von Prozent_Freier_Speicherplatz ist eine Ganzzahl zwischen 0 und 100. Der erste Wert bedeutet, dass auf den einzelnen Seiten kein freier Platz zur Verfügung stehen darf, d.h. jede Seite wird vollgeschrieben. Ein hoher Wert führt dazu, dass jede Zeile auf eine eigene Seite geschrieben wird. Wenn PCTFREE nicht festgelegt oder später gelöscht wurde, wird der PCTFREE-Standardwert entsprechend der Datenbank-Seitengröße angewendet (200 Byte für eine 4KByte-Seitengröße und höher). Der Wert für PCTFREE wird in der Systemtabelle ISYSTAB gespeichert.

Bemerkungen

Die CREATE TABLE-Anweisung erstellt eine neue Tabelle. Eine Tabelle kann für einen anderen Benutzer erstellt werden, indem ein Eigentümername angegeben wird. Wenn GLOBAL TEMPORARY angegeben wird, handelt es sich bei der Tabelle um eine temporäre Tabelle. Andernfalls ist es eine Basistabelle.

Tabellen, die erstellt werden, indem dem Tabellennamen in der CREATE TABLE-Anweisung ein Rautenzeichen (#) vorangestellt wird, werden als temporäre Tabellen deklariert, die nur in der aktuellen Verbindung verfügbar sind. Temporäre Tabellen, die mit dem Rautenzeichen (#) erstellt wurden, sind identisch mit denen, die mit der Klausel ON COMMIT PRESERVE ROWS erstellt wurden. Weitere Hinweise finden Sie unter DECLARE LOCAL TEMPORARY TABLE-Anweisung.

Spalten in SQL Anywhere lassen standardmäßig NULL zu. Diese Einstellung kann mit der Datenbankoption allow_nulls_by_default gesteuert werden. Weitere Hinweise finden Sie unter allow_nulls_by_default-Option [Kompatibilität].

Berechtigungen

RESOURCE-Datenbankberechtigung ist erforderlich.

Sie müssen über DBA-Berechtigungen verfügen, um eine Tabelle für einen anderen Benutzer erstellen zu können.

Nebenwirkungen

Automatisches Festschreiben (Autocommit).

Siehe auch
Standards und Kompatibilität
  • SQL/2003   Kernfunktion.

    Im Folgenden werden Erweiterungen des Herstellers aufgeführt:

    • Die { IN | ON } DBSspace_Name-Klausel

    • Die ON COMMIT-Klausel

    • Einige Standardwerte

Beispiele

Mit dem folgenden Beispiel wird eine Tabelle für eine Bibliotheksdatenbank zur Aufnahme von Bücherdaten erstellt.

CREATE TABLE library_books (
   -- NOT NULL is assumed for primary key columns
   isbn CHAR(20) PRIMARY KEY,
   copyright_date DATE,
   title CHAR(100),
   author CHAR(50),
   -- column(s) corresponding to primary key of room
   -- are created automatically
   FOREIGN KEY location REFERENCES room
);

Mit dem folgenden Beispiel wird eine Tabelle für eine Bibliotheksdatenbank zur Aufnahme von Angaben über ausgeliehene Bücher erstellt. Der Standardwert für date_borrowed zeigt an, dass das Buch an dem Tag ausgeliehen wurde, an dem der Eintrag erfolgte. Die Spalte date_returned ist NULL, bis das Buch zurückgegeben wird.

CREATE TABLE borrowed_book (
   date_borrowed DATE NOT NULL DEFAULT CURRENT DATE,
   date_returned DATE,
   book CHAR(20)
   REFERENCES library_books (isbn),
   -- The check condition is UNKNOWN until
   -- the book is returned, which is allowed
CHECK( date_returned >= date_borrowed )
);

Mit dem folgenden Beispiel werden Tabellen für die Datenbank einer Verkaufsabteilung zur Aufnahme von Angaben zu Aufträgen und Auftragspositionen erstellt.

CREATE TABLE Orders (
   order_num INTEGER NOT NULL PRIMARY KEY,
   date_ordered DATE,
   name CHAR(80)
);
CREATE TABLE Order_item (
   order_num INTEGER NOT NULL,
   item_num SMALLINT NOT NULL,
   PRIMARY KEY ( order_num, item_num ),
   -- When an order is deleted, delete all of its
   -- items.
   FOREIGN KEY ( order_num )
   REFERENCES Orders ( order_num )
   ON DELETE CASCADE
);

Mit dem folgenden Beispiel werden die Tabelle t1 auf dem Fremdserver SERVER_A und die Proxytabelle t1 erstellt, die der entfernten Tabelle zugeordnet wird.

CREATE TABLE t1
( a INT,
  b CHAR(10) )
AT 'SERVER_A.db1.joe.t1';