Erstellt eine neue Tabelle in der Datenbank und optional eine Tabelle auf einem Fremdserver.
CREATE [ GLOBAL TEMPORARY ] TABLE [ IF NOT EXISTS ] [ owner.]table-name ( { column-definition | table-constraint | pctfree }, ... ) [ { IN | ON } dbspace-name ] [ ENCRYPTED ] [ ON COMMIT { DELETE | PRESERVE } ROWS | NOT TRANSACTIONAL ] [ AT location-string ] [ SHARE BY ALL ]
column-definition : column-name data-type [ COMPRESSED ] [ INLINE { inline-length | USE DEFAULT } ] [ PREFIX { prefix-length | USE DEFAULT } ] [ [ NO ] INDEX ] [ [ NOT ] NULL ] [ DEFAULT default-value | IDENTITY ] [ column-constraint ... ]
default-value : special-value | string | global-variable | [ - ] number | ( constant-expression ) | ( sequence-expression ) | built-in-function( constant-expression ) | AUTOINCREMENT | GLOBAL AUTOINCREMENT [ ( partition-size ) ]
special-value : CURRENT DATABASE | CURRENT DATE | CURRENT TIME | [ CURRENT ] TIMESTAMP | CURRENT PUBLISHER | CURRENT REMOTE USER | [ CURRENT ] USER | [ CURRENT ] UTC TIMESTAMP | LAST USER | NULL
column-constraint : [ CONSTRAINT constraint-name ] { UNIQUE [ CLUSTERED ] | PRIMARY KEY [ CLUSTERED ] [ ASC | DESC ] | REFERENCES table-name [ ( column-name ) ] [ MATCH [ UNIQUE ] { SIMPLE | FULL } ] [ action-list ] [ CLUSTERED ] | CHECK ( condition ) } | COMPUTE ( expression )
table-constraint : [ CONSTRAINT constraint-name ] { UNIQUE [ CLUSTERED ] ( column-name [ ASC | DESC ], ... ) | PRIMARY KEY [ CLUSTERED ] ( column-name [ ASC | DESC ], ... ) | CHECK ( condition ) | foreign-key-constraint }
foreign-key-constraint : [ NOT NULL ] FOREIGN KEY [ role-name ] [ ( column-name [ ASC | DESC ], ... ) ] REFERENCES table-name [ ( column-name, ... ) ] [ MATCH [ UNIQUE] { SIMPLE | FULL } ] [ action-list ] [ CHECK ON COMMIT ] [ CLUSTERED ] [ FOR OLAP WORKLOAD ]
action-list : [ ON UPDATE action ] [ ON DELETE action ]
action : CASCADE | SET NULL | SET DEFAULT | RESTRICT
location-string : remote-server-name.[db-name].[owner].object-name | remote-server-name;[db-name];[owner];object-name
pctfree : PCTFREE percent-free-space
percent-free-space : integer
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.
ENCRYPTED-Klausel Die Klausel ENCRYPTED gibt an, dass die Tabelle verschlüsselt werden soll. Wenn Sie vorhaben, Tabellen zu verschlüsseln, müssen Sie beim Erstellen einer Datenbank die Tabellenverschlüsselung aktivieren. Die Verschlüsselung erfolgt unter Verwendung des Chiffrierschlüssels und des Algorithmus, die bei der Datenbankerstellung festgelegt wurden.
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.
AT-Klausel Erstellt eine entfernte Tabelle auf einem anderen Server, der durch location-string 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 location-string. 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 beispielsweise die Tabelle "proxy_Customers" einer neuen Tabelle "Customers" in einer fiktiven Microsoft Access-Datenbank namens MyAccessDB zu:
CREATE TABLE proxy_Customers ( ID INTEGER CONSTRAINT PRIMARY KEY, ClientName TEXT, ClientAddress TEXT, Telephone TEXT ) AT 'MyAccessDB;;;Customers'; |
Die Zeichenfolge in der AT-Klausel kann auch lokale oder globale Variablennamen in geschweiften Klammern enthalten ({variable-name}). Der SQL-Variablenname muss vom Typ CHAR, VARCHAR oder LONG VARCHAR sein. Eine AT-Klausel mit 'access;{@myfile};;a1'
zeigt beispielsweise an, dass @myfile eine SQL-Variable ist und dass der aktuelle Inhalt der @myfile-Variablen beim Erstellen der Proxy-Tabelle ersetzt werden muss.
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.
IF NOT EXISTS-Klausel Existiert die angegebene Tabelle bereits, werden keine Änderungen durchgeführt und keine Fehlermeldung ausgegben.
column-definition Definiert eine Spalte in der Tabelle. Nachfolgend werden die Bestandteile von Spaltendefinitionen aufgeführt.
INLINE- und PREFIX-Klausel 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.
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 Seitengröße der Datenbank ü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 Seitengröße der Datenbank 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 deaktiviert ist. Um die BLOB-Indizierung für eine Spalte zu deaktivieren, geben Sie NO INDEX ein.
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. Diese Einstellung wird mit der Datenbankoption allow_nulls_by_default gesteuert.
Standardmäßig sind Spalten, die als BIT deklariert sind, nicht nullwertfähig, können aber explizit nullwertfähig gemacht werden.
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 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:
special-value Sie verwenden eine von mehreren Spezialwerten in der DEFAULT-Klausel.
[ CURRENT ] TIMESTAMP 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 Tageszeit 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.
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.
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.
Die globale Variable @@dbts gibt einen TIMESTAMP-Wert zurück, der den zuletzt für eine Spalte mit DEFAULT TIMESTAMP generierten Wert repräsentiert.
[ CURRENT ] UTC TIMESTAMP Damit kann angezeigt werden, wann die einzelnen Zeilen in der Tabelle zuletzt geändert wurden. Ist eine Spalte mit DEFAULT UTC TIMESTAMP deklariert, dann wird bei Einfügungen ein Standardwert bereitgestellt, und der Wert wird bei jeder Aktualisierung der Zeile mit der aktuellen Coordinated Universal Time (UTC) aktualisiert, wenn die Zeile aktualisiert wird.
Um einen Standardwert beim Einfügen bereitzustellen, die Spalte aber nicht bei jeder Zeilenaktualisierung zu aktualisieren, verwenden Sie DEFAULT CURRENT UTC TIMESTAMP anstatt DEFAULT UTC TIMESTAMP.
Das Verhalten dieses Standardwerts ist dasselbe wie TIMESTAMP und CURRENT TIMESTAMP mit dem Unterschied, dass das Datum und die Uhrzeit in der Coordinated Universal Time (UTC) angezeigt werden.
string Siehe Zeichenfolgen.
global-variable Siehe Globale Variablen.
constant-expression 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.
sequence-expression Sie können DEFAULT auf den aktuellen oder nächsten Wert aus einer Sequenz in der Datenbank setzen.
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, 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.
AUTOINCREMENT-Werte werden als 64-Bit-Ganzzahlwerte mit Vorzeichen aufrechterhalten, 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.
Der nächste Wert für eine Spalte kann unter Verwendung der Prozedur sa_reset_identity zurückgesetzt werden.
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 ist als p(n+ 1), 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 aufrechterhalten, 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.
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.
Der nächste Wert für eine Spalte kann unter Verwendung der Prozedur sa_reset_identity zurückgesetzt werden.
LAST USER LAST USER ist die Benutzer-ID des Benutzers, der die Zeile zuletzt geändert hat.
LAST USER kann als Standardwert in Spalten mit Zeichendatentypen verwendet werden.
Dieser Standardwert hat bei INSERT dieselbe Wirkung wie CURRENT USER.
Wenn Sie eine Spalte mit einem Standardwert LAST USER bei einer UPDATE-Anweisung nicht ausdrücklich ändern, wird sie auf den Namen des aktuellen Benutzers abgeändert.
In Kombination mit DEFAULT TIMESTAMP oder DEFAULT UTC TIMESTAMP kann der Standardwert LAST USER dazu verwendet werden, sowohl den Benutzer als auch Datum und Uhrzeit der letzten Änderung an einer Zeile zu erfassen (in getrennten Spalten).
IDENTITY-Klausel IDENTITY ist eine Transact-SQL-kompatible Alternative zur Verwendung von DEFAULT AUTOINCREMENT. In SQL Anywhere wird eine mit IDENTITY definierte Spalte als DEFAULT AUTOINCREMENT implementiert.
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 vor dem Auftreten des Fehlers vorgenommen wurden, 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). CHECK-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. Eine Spalten-Integritätsregel ist eine Spalte in einer Tabelle, während sich eine Tabellen-Integritätsregel auf eine oder mehrere Spalten in der Tabelle beziehen kann.
PRIMARY KEY-Klausel 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 column-constraint-Klausel gibt die Verwendung von PRIMARY KEY an, dass die Spalte der Primärschlüssel für die Tabelle ist. In einer table-constraint-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 als Clustered-Index erstellt werden soll, indem Sie das Schlüsselwort CLUSTERED 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.
Spalten mit räumlichen Daten können nicht in einen Primärschlüssel einbezogen werden.
FOREIGN KEY-Klausel 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.
Die Reihenfolge der Fremdschlüsselspalten muss nicht der Reihenfolge der Spalten in der Tabelle entsprechen.
Doppelte Spaltennamen sind in der Fremdschlüsselspezifikation nicht zulässig.
Die Standardaktion (action) 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 als Clustered-Index erstellt werden soll, indem Sie das Schlüsselwort CLUSTERED verwenden.
Eine globale temporäre Tabelle kann keinen Fremdschlüssel besitzen, der eine Basistabelle referenziert, und eine Basistabelle kann keinen Fremdschlüssel besitzen, der eine globale temporäre Tabelle referenziert.
Wenn Sie versuchen, einen Fremdschlüssel zu einer nicht vorhandenen Spalte hinzuzufügen, wird die Spalte automatisch erstellt.
NOT NULL-Klausel 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.
role-name-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:
Wenn es keinen Fremdschlüssel mit einem Rollennamen gibt, der genauso lautet wie der Tabellenname, wird der Tabellenname als Rollenname zugeordnet.
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-Spalten-Integritä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 column-name-Wert in einer REFERENCES-Spalten-Integritä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 column-name-Wert angeben, referenziert die Fremdschlüsselspalte die einzelne Primärschlüsselspalte der Primärtabelle.
MATCH-Klausel Die MATCH-Klausel legt fest, was als Übereinstimmung gilt, wenn ein Mehrspalten-Fremdschlüssel verwendet wird, indem Sie einstellen können, was als verwaiste Zeile und was als Verletzung der referenziellen Integrität zu behandeln ist. Die MATCH-Klausel ermöglicht es Ihnen außerdem, Eindeutigkeit für den Schlüssel anzugeben, wodurch sich ein separates Deklarieren der Eindeutigkeit erübrigt.
Es folgt eine Liste der MATCH-Typen, die Sie angeben können. Im Abschnitt "Beispiele" am Ende dieses Themas finden Sie eine Beschreibung dazu, wie sich der MATCH-Typ auf die Suche nach Übereinstimmungen auswirkt.
MATCH [ UNIQUE ] SIMPLE Eine Übereinstimmung tritt für eine Zeile in der Fremdschlüsseltabelle auf, wenn alle Spaltenwerte mit den entsprechenden Spaltenwerten in einer Zeile der Primärschlüsseltabelle übereinstimmen. Eine Zeile wird in der Fremdschlüsseltabelle zur Waisen, wenn mindestens ein Spaltenwert im Fremdschlüssel NULL ist.
MATCH SIMPLE ist das Standardverhalten.
Wenn das UNIQUE-Schlüsselwort angegeben ist, kann die referenzierende Tabelle bei Nicht-NULL-Schlüsselwerten jeweils nur eine Übereinstimmung enthalten.
MATCH [ UNIQUE ] FULL Eine Übereinstimmung tritt für eine Zeile in der Fremdschlüsseltabelle auf, wenn keiner der Werte NULL ist und die Werte mit den entsprechenden Spaltenwerten in einer Zeile der Primärschlüsseltabelle übereinstimmen. Eine Zeile wird zur Waisen, wenn alle Spaltenwerte im Fremdschlüssel NULL sind.
Wenn das UNIQUE-Schlüsselwort angegeben ist, kann die referenzierende Tabelle bei Nicht-NULL-Schlüsselwerten jeweils nur eine Übereinstimmung enthalten.
UNIQUE-Klausel In einer column-constraint-Klausel gibt eine UNIQUE-Integritätsregel an, dass die Werte in der Spalte eindeutig sein müssen. In einer table-constraint-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 als Clustered-Integritätsregel erstellt werden soll, indem Sie das Schlüsselwort CLUSTERED verwenden.
CHECK-Klausel 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.
Wenn Sie eine Prüf-Integritätsregel erstellen müssen, die eine Beziehung zwischen zwei oder mehr Spalten in der Tabelle umfasst (beispielsweise muss Spalte A kleiner sein als Spalte B), definieren Sie anstelle dessen eine Tabellenintegritätsregel.
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.
COMPUTE-Klausel Die COMPUTE-Klausel ist nur zur Verwendung in einer column-constraint-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.
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-Klausel 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 Fremdschlüsselüberprüfung, nicht aber andere Aktionen, z.B. CASCADE, SET NULL, SET DEFAULT, oder CHECK-Integritätsregeln.
FOR OLAP WORKLOAD-Klausel 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 die Option optimization_workload auf OLAP gesetzt ist.
PCTFREE-Klausel Gibt den Prozentsatz des freien Speicherplatzes an, der für jede Tabellenseite reserviert werden soll. Der freie Speicherplatz wird verwendet, wenn die Größe der Zeilen durch die Datenaktualisierung zunimmt. 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 percent-free-space 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 Seitengröße der Datenbank angewendet (200 Byte für eine Seitengröße von 4 kB und mehr). Der Wert für PCTFREE wird in der Systemtabelle ISYSTAB gespeichert.
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.
Zwei lokale temporäre Tabellen in demselben Geltungsbereich können nicht den gleichen Namen haben. Falls Sie eine temporäre Tabelle mit demselben Namen wie eine Basistabelle erstellen, wird die Basistabelle innerhalb der Verbindung erst sichtbar, wenn der Bereich der lokalen temporären Tabelle endet. Eine Verbindung kann keine Basistabelle mit dem Namen einer vorhandenen temporären Tabelle erstellen.
Spalten in SQL Anywhere lassen standardmäßig NULL zu. Diese Einstellung kann mit der Datenbankoption allow_nulls_by_default gesteuert werden.
Sie müssen das CREATE TABLE-Systemprivileg haben, um Tabellen erstellen zu können, deren Eigentümer Sie sind. Sie müssen das CREATE ANY TABLE-Systemprivileg oder das CREATE ANY OBJECT-Systemprivileg haben, um Tabellen erstellen zu können, deren Eigentümer andere Benutzer sind.
Wenn Sie Proxy-Tabellen erstellen möchten, deren Eigentümer Sie sind, müssen Sie das CREATE PROXY TABLE-Systemprivileg haben. Sie müssen das CREATE ANY TABLE-Systemprivileg oder das CREATE ANY OBJECT-Systemprivileg haben, um Proxy-Tabellen erstellen zu können, deren Eigentümer andere Benutzer sind.
Automatisches Festschreiben (auch, wenn Sie globale temporäre Tabellen erstellen).
SQL/2008 CREATE TABLE ist eine Kernfunktion des SQL/2008-Standards, obwohl einige der in SQL Anywhere unterstützten Komponenten optionale SQL-Sprachenfunktionen sind. Zu diesen Funktionen gehören folgende:
Die Unterstützung für temporäre Tabellen ist SQL-Sprachenfunktion F531.
Die Unterstützung für IDENTITY-Spalten ist SQL-Funktion T174, obwohl SQL Anywhere eine etwas andere Syntax verwendet als der Standard.
Die Unterstützung für Fremdschlüssel-Integritätsregeln umfasst die SQL-Sprachenfunktion T191 (referenzielle Aktion RESTRICT), F741 (referenzielle MATCH-Typen), F191 (referenzielle Löschaktionen) und F701 (referenzielle UPDATE-Aktionen). SQL Anywhere bietet keine Unterstützung für MATCH PARTIAL.
SQL Anywhere bietet keine Unterstützung für SQL-Sprachenfunktion T591 (UNIQUE-Integritätsregeln potenzieller NULL-Spalten). In SQL Anywhere müssen alle Spalten, die Teil einer UNIQUE- oder PRIMARY KEY-Integritätsregel sind, als NOT NULL deklariert werden.
Die folgenden Komponenten von CREATE TABLE sind Erweiterungen des Herstellers:
Die { IN | ON } dbspace-name-Klausel
Die Klauseln ENCRYPTED, NOT TRANSACTIONAL und SHARE BY ALL.
Die Klauseln COMPRESSED, INLINE, PREFIX und NO INDEX einer Spaltendefinition.
Verschiedene in der Implementierung definierte DEFAULT-Werte, einschließlich AUTOINCREMENT, GLOBAL AUTOINCREMENT, CURRENT DATABASE, CURRENT REMOTE USER, CURRENT UTC TIMESTAMP, sowie die meisten Spezialwerte. Eine DEFAULT-Klausel, die einen Sequenzgenerator referenziert, ist ebenfalls eine Erweiterung des Herstellers.
Die Spezifikation von MATCH UNIQUE.
Die Sortierungsspezifikation (ASC oder DESC) in einer PRIMARY KEY oder FOREIGN KEY-Klausel.
Die Möglichkeit zum Angeben von FOREIGN KEY-Spalten in einer anderen Reihenfolge als in der PRIMARY KEY-Klausel der referenzierten Tabelle angegeben.
Die folgende Anweisung erstellt die Tabelle "file_table" mit zwei Spalten: file_name und file_contents. Die Spalte contents ist LONG BINARY und komprimiert:
CREATE TABLE file_table ( file_name VARCHAR(255), file_contents LONG BINARY COMPRESSED ); |
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 ); |
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 ); |
Im folgenden Beispiel wird die Tabelle "t1" auf dem fiktiven Fremdserver SERVER_A erstellt und die Proxytabelle "t1", die der entfernten Tabelle zugeordnet ist.
CREATE TABLE t1 ( a INT, b CHAR(10) ) AT 'SERVER_A.db1.joe.t1'; |
Im folgenden Beispiel werden zwei Tabellen namens Table1 und Table2 erstellt, Fremdschlüssel zu Table2 hinzugefügt und Werte in Table1 eingefügt. In der letzten Anweisung wird versucht, Werte in Table2 einzufügen. Ein Fehler wird zurückgegeben, weil die Werte, die Sie einzufügen versuchen, keine einfache Übereinstimmung mit Table1 darstellen.
CREATE TABLE Table1 ( P1 INT, P2 INT, P3 INT, P4 INT, P5 INT, P6 INT, PRIMARY KEY ( P1, P2 ) ); CREATE TABLE Table2 ( F1 INT, F2 INT, F3 INT, PRIMARY KEY ( F1, F2 ) ); ALTER TABLE Table2 ADD FOREIGN KEY fk2( F1,F2 ) REFERENCES Table1( P1, P2 ) MATCH SIMPLE; INSERT INTO Table1 (P1, P2, P3, P4, P5, P6) VALUES ( 1,2,3,4,5,6 ); INSERT INTO Table2 (F1,F2) VALUES ( 3,4 ); |
Die folgenden Anweisungen zeigen, wie MATCH SIMPLE und MATCH SIMPLE UNIQUE sich in der Art unterscheiden, wie Fremdschlüssel mit mehreren Spalten verarbeitet werden, wenn einige, aber nicht alle Spalten im Schlüssel NULL sind. Diese Anweisung schlägt fehl, weil die Werte für die zweite Spalte nicht eindeutig sind.
CREATE TABLE pt( pk INT PRIMARY KEY, str VARCHAR(10)); INSERT INTO pt VALUES(1,'one'), (2,'two'); COMMIT; CREATE TABLE ft1( fpk INT PRIMARY KEY, FOREIGN KEY (ref) REFERENCES pt MATCH SIMPLE); INSERT INTO ft1 VALUES(100,1), (200,1); //Diese Anweisung fügt 2 Zeilen ein. CREATE TABLE ft2( fpk INT PRIMARY KEY, FOREIGN KEY (ref) REFERENCES pt MATCH UNIQUE SIMPLE); INSERT INTO ft2 VALUES(100,1), (200,1); |
Die folgenden Anweisungen zeigen, wie sich MATCH SIMPLE und MATCH UNIQUE SIMPLE unterscheiden:
CREATE TABLE pt2( pk1 INT NOT NULL, pk2 INT NOT NULL, str VARCHAR(10), PRIMARY KEY (pk1,pk2)); INSERT INTO pt2 VALUES(1,10,'one-ten'), (2,20,'two-twenty'); COMMIT; CREATE TABLE ft3( fpk INT PRIMARY KEY, ref1 INT, ref2 INT ); ALTER TABLE ft3 ADD FOREIGN KEY (ref1,ref2) REFERENCES pt2 (pk1,pk2) MATCH SIMPLE; CREATE TABLE ft4( fpk INT PRIMARY KEY, ref1 INT, ref2 INT ); INSERT INTO ft3 VALUES(100,1,10); // MATCH SIMPLE-Test ist erfolgreich, weil alle Spaltenwerte mit den entsprechenden Werten in pt2 übereinstimmen. INSERT INTO ft3 VALUES(200,null,null); // MATCH SIMPLE-Test ist erfolgreich, weil mindestens eine Spalte im Schlüssel NULL ist. INSERT INTO ft3 VALUES(300,2,null); // MATCH SIMPLE-Test ist erfolgreich, weil mindestens eine Spalte im Schlüssel NULL ist. INSERT INTO ft4 VALUES(100,1,10); // MATCH SIMPLE-Test ist erfolgreich, weil alle Spaltenwerte mit den entsprechenden Werten in pt2 übereinstimmen. INSERT INTO ft4 VALUES(200,null,null); // MATCH SIMPLE-Test ist erfolgreich, weil mindestens eine Spalte im Schlüssel NULL ist. INSERT INTO ft4 VALUES(300,2,null); // MATCH FULL-Test schlägt fehl, weil beide Spalten im Schlüssel NULL sein oder mit den entsprechenden Werten in pt2 übereinstimmen müssen. |
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2013, SAP AG oder ein SAP-Konzernunternehmen. - SAP Sybase SQL Anywhere 16.0 |