Ändert eine Tabellendefinition oder deaktiviert abhängige Ansichten.
ALTER TABLE [owner.]table-name { alter-clause, ... }
alter-clause : ADD create-clause | ALTER column-name column-alteration | ALTER [ CONSTRAINT constraint-name ] CHECK ( condition ) | DROP drop-object | RENAME rename-object | table-alteration
create-clause : column-name [ AS ] column-data-type [ new-column-attribute ... ] | table-constraint | PCTFREE integer
column-alteration : { column-data-type | alterable-column-attribute } [ alterable-column-attribute ... ] | SET COMPUTE ( compute-expression ) | ADD [ constraint-name ] CHECK ( condition ) | DROP { DEFAULT | COMPUTE | CHECK | CONSTRAINT constraint-name }
drop-object : column-name | CHECK | CONSTRAINT constraint-name | UNIQUE [ CLUSTERED ] ( index-columns-list ) | FOREIGN KEY fkey-name | PRIMARY KEY
rename-object : new-table-name | column-name TO new-column-name | CONSTRAINT constraint-name TO new-constraint-name
table-alteration : PCTFREE DEFAULT | [ NOT ] ENCRYPTED
new-column-attribute : [ NOT ] NULL | DEFAULT default-value | COMPRESSED | INLINE { inline-length | USE DEFAULT } | PREFIX { prefix-length | USE DEFAULT } | [ NO ] INDEX | IDENTITY | COMPUTE ( expression ) | column-constraint
table-constraint : [ CONSTRAINT constraint-name ] { CHECK ( condition ) | UNIQUE [ CLUSTERED | NONCLUSTERED ] ( column-name [ ASC | DESC ], ... ) | PRIMARY KEY [ CLUSTERED | NONCLUSTERED ] ( column-name [ ASC | DESC ], ... ) | foreign-key }
column-constraint : [ CONSTRAINT constraint-name ] { CHECK ( condition ) | UNIQUE [ CLUSTERED | NONCLUSTERED ] [ ASC | DESC ] | PRIMARY KEY [ CLUSTERED | NONCLUSTERED ] [ ASC | DESC ] | REFERENCES table-name [ ( column-name ) ] [ MATCH [ UNIQUE ] { SIMPLE | FULL } ] [ actions ][ CLUSTERED | NONCLUSTERED ] | NOT NULL }
alterable-column-attribute : [ NOT ] NULL | DEFAULT default-value | [ CONSTRAINT constraint-name ] CHECK { NULL | ( condition ) } | [ NOT ] COMPRESSED | INLINE { inline-length | USE DEFAULT } | PREFIX { prefix-length | USE DEFAULT } | [ NO ] INDEX
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
foreign-key : [ NOT NULL ] FOREIGN KEY [ role-name ] [ ( column-name [ ASC | DESC ], ... ) REFERENCES table-name [ ( pkey-column-list ) ] [ MATCH [ UNIQUE] { SIMPLE | FULL } ] [ actions ] [ CHECK ON COMMIT ] [ CLUSTERED ] [ FOR OLAP WORKLOAD ]
actions : [ ON UPDATE action ] [ ON DELETE action ]
action : CASCADE | SET NULL | SET DEFAULT | RESTRICT
ALTER TABLE [owner.]table-name { DISABLE VIEW DEPENDENCIES }
Hinzufügeklauseln Im folgenden Abschnitt werden die Klauseln erläutert, die zum Hinzufügen von Spalten oder Integritätsregeln zu einer Tabelle verwendet werden:
ADD column-name [ AS ] column-data-type [ new-column-attribute ... ]-Klausel Verwenden Sie diese Klausel, um der Tabelle eine neue Spalte hinzuzufügen, indem Sie den Datentyp und Attribute für die Spalte angeben.
NULL- und NOT NULL-Klauseln Verwenden Sie diese Klausel, um anzugeben, ob NULL in der Spalte zulässig ist. Standardmäßig ist NULL bei neuen Spalten zulässig. Bei BIT-Typ-Spalten wird automatisch die NOT NULL-Integritätsregel angewendet, wenn sie erstellt werden. Sie können aber eine BIT-Typ-Spalte als nullwertfähig deklarieren.
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.
Durch Kombinieren mit DEFAULT TIMESTAMP oder DEFUALT UTC TIMESTAMP kann ein Standardwert LAST USER dazu verwendet werden, sowohl den Benutzer als auch Datum und Zeit zu protokollieren (in getrennten Spalten), wenn eine Zeile zuletzt geändert wurde.
column-constraint-Klausel Verwenden Sie diese Klausel, um der Spalte eine Integritätsregel hinzuzufügen. Wenn eine neue Integritätsregel hinzugefügt wird, validiert der Datenbankserver (außer bei CHECK-Integritätsregeln) bestehende Werte, um zu bestätigen, dass sie der Integritätsregel entsprechen. CHECK-Integritätsregeln werden nur bei Vorgängen erzwungen, die nach Abschluss der Tabellenänderung auftreten. Mögliche Spalten-Integritätsregeln sind:
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.
UNIQUE-Klausel Verwenden Sie diese Unterklausel, um anzugeben, dass die Werte in der Spalte eindeutig sein müssen, und ob ein Clustered- oder ein Nonclustered-Index erstellt werden soll.
PRIMARY KEY-Klausel Verwenden Sie diese Unterklausel, um die Spalte zu einem Primärschlüssel zu machen und um anzugeben, ob ein Clustered-Index verwendet werden soll.
REFERENCES-Klausel Verwenden Sie diese Unterklausel, um eine Referenz zu einer anderen Tabelle hinzuzufügen oder zu ändern, und um anzugeben, wie Übereinstimmungen gehandhabt und ob ein Clustered-Index verwendet werden soll.
MATCH-Klausel Mit dieser Unterklausel können Sie steuern, was als Ü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.
NULL- und NOT NULL-Klauseln Verwenden Sie diese Klausel, um anzugeben, ob NULL in der Spalte zulässig ist. Standardmäßig ist NULL zulässig.
COMPRESSED-Klausel Verwenden Sie diese Klausel, um die Spalte zu komprimieren.
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.
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.
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.
COMPUTE-Klausel 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.
ADD table-constraint-Klausel Verwenden Sie diese Klausel, um eine Tabellen-Integritätsregel hinzuzufügen. Tabellen-Integritätsregeln beschränken den Inhalt von Spalten in der Tabelle. Wenn Sie Tabellen-Integritätsregeln hinzufügen oder ändern, ermöglicht Ihnen der optionale Integritätsregelname, einzelne Integritätsregeln zu ändern oder zu löschen. Es folgt eine Liste der möglichen Tabellen-Integritätsregeln.
UNIQUE Verwenden Sie diese Unterklausel, um anzugeben, dass Werte in den unter column-list angegebenen Spalten eindeutig sein müssen, und ob ein Clustered-Index verwendet werden soll (optional).
PRIMARY KEY Verwenden Sie diese Unterklausel, um den Primärschlüssel für die Tabelle hinzuzufügen oder zu ändern, und um anzugeben, ob ein Clustered-Index verwendet werden soll. Die Tabelle darf noch keinen Primärschlüssel besitzen, der mit der Anweisung CREATE TABLE oder einer weiteren ALTER TABLE-Anweisung erstellt wurde.
foreign-key Verwenden Sie diese Unterklausel, um einen Fremdschlüssel als Integritätsregel hinzuzufügen. Wenn Sie eine andere Subklausel als ADD FOREIGN KEY mit der ALTER TABLE-Anweisung bei einer Tabelle mit abhängigen materialisierten Ansichten verwenden, schlägt die ALTER TABLE Anweisung fehl. Bei allen anderen Klauseln müssen Sie die abhängigen materialisierten Ansichten deaktivieren und sie anschließend reaktivieren, nachdem Ihre Änderungen abgeschlossen sind.
Bei Verwendung eines Fremdschlüssels mit mehreren Spalten können Sie mithilfe einer MATCH-Unterklausel steuern, was als Übereinstimmung betrachtet wird. Sie ermöglicht es Ihnen auch, Eindeutigkeit für den Schlüssel anzugeben, wodurch sich ein separates Deklarieren der Eindeutigkeit erübrigt.
ADD PCTFREE-Klausel Geben Sie den Prozentsatz des Speicherplatzes an, den Sie in jeder Tabellenseite reservieren möchten. 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. Ein Prozentsatz für freien Speicherplatz von 0 bedeutet, dass auf den einzelnen Seiten kein freier Platz zur Verfügung stehen darf —jede Seite wird vollgeschrieben. Ein hoher Prozentsatz hat zur Folge, dass jede einzelne Zeile auf eine eigene Seite eingefügt wird. Wenn PCTFREE nicht festgelegt ist oder gelöscht wurde, wird der PCTFREE-Standardwert entsprechend der Datenbank-Seitengröße angewendet (200 Byte für eine Seitengröße von 4 kB und mehr). Der Wert für PCTFREE wird in der Systemtabelle ISYSTAB gespeichert. Wenn PCTFREE festgelegt ist, verwenden alle nachfolgenden Einträge in die Tabellenseiten den neuen Wert, bereits eingefügte Zeilen werden dadurch jedoch nicht beeinflusst. Der Wert bleibt bestehen, bis er geändert wird. Die Angabe von PCTFREE kann für Basistabellen, globale temporäre oder lokale temporäre Tabellen verwendet werden.
Änderungsklauseln Im folgenden Abschnitt werden die Klauseln erklärt, die zum Ändern von Definitionen einer Spalte oder Tabelle verwendet werden:
ALTER column-name column-alteration-Klausel Verwenden Sie diese Klausel, um die Attribute für die angegebene Spalte zu ändern. Wenn eine Spalte in einer Eindeutigkeits-Integritätsregel, einem Fremdschlüssel oder einem Primärschlüssel enthalten ist, können Sie nur den Standardwert für die Spalte ändern. Für alle anderen Änderungen müssen Sie hingegen den Schlüssel oder die Integritätsregel löschen, bevor Sie die Spalte ändern.
column-data-type-Klausel Verwenden Sie diese Klausel, um die Länge oder den Datentyp der Spalte zu ändern. Wenn nötig werden die Daten in der geänderten Spalte in einen neuen Datentyp konvertiert. Wenn ein Konvertierungsfehler auftritt, schlägt der Vorgang fehl und die Tabelle bleibt unverändert. Sie können die Größe einer Spalte nicht vermindern. Beispiel: Sie können eine Spalte nicht von VARCHAR(100) auf VARCHAR(50) ändern.
[ NOT ] NULL-Klausel Verwenden Sie diese Klausel, um die Einstellung in Bezug auf die Zulässigkeit von NULL in der Spalte zu ändern. Wenn NOT NULL angegeben wird und der Spaltenwert in einer bestehenden Zeile NULL ist, schlägt der Vorgang fehl und die Tabelle bleibt unverändert.
CHECK NULL-Klausel Verwenden Sie diese Klausel, um alle Prüf-Integritätsregeln für die Spalte zu löschen.
DEFAULT-Klausel Verwenden Sie diese Klausel, um den Standardwert für die Spalte zu ändern.
DEFAULT NULL-Klausel Verwenden Sie diese Klausel, um den Standardwert für die Spalte zu entfernen.
[ CONSTRAINT constraint-name ] CHECK { NULL | ( condition ) }-Klausel Verwenden Sie diese Klausel, um der Spalte eine Prüf-Integritätsregel hinzuzufügen.
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.
[ NOT ] COMPRESSED-Klausel Verwenden Sie diese Klausel, um die Einstellung in Bezug auf die Spaltenkomprimierung zu ändern.
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.
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.
SET COMPUTE-Klausel 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.
ALTER CONSTRAINT constraint-name CHECK-Klausel Verwenden Sie diese Klausel, um eine benannte Prüf-Integritätsregel für die Tabelle zu ändern.
Wenn Sie die Integritätsregel ändern möchten, um eine Beziehung zwischen zwei oder mehr Spalten in der Tabelle anzugeben (beispielsweise muss die Spalte A kleiner sein als die Spalte B), müssen Sie anstelle dessen eine Tabellenintegritätsregeln angeben.
Löschklauseln Im folgenden Abschnitt werden die DROP-Klauseln erklärt:
DROP DEFAULT Löscht den Standardwert, der für die Tabelle oder die angegebene Spalte gesetzt ist. Bestehende Werte ändern sich nicht.
DROP COMPUTE Entfernt das COMPUTE-Attribut für die angegebene Spalte. Diese Anweisung ändert keine bestehenden Werte in der Tabelle.
DROP CHECK Löscht alle Prüf-Integritätsregeln für die Tabelle oder angegebene Spalte. DELETE CHECK wird ebenfalls akzeptiert.
DROP CONSTRAINT constraint-name Löscht die benannte Integritätsregel für die Tabelle oder angegebene Spalte. DELETE CONSTRAINT wird ebenfalls akzeptiert.
DROP column-name Löscht die angegebene Spalte aus der Tabelle. DELETE column-name wird ebenfalls akzeptiert. Wenn die Spalte in einem Index, einer Eindeutigkeits-Integritätsregel, einem Fremdschlüssel oder Primärschlüssel enthalten ist, muss der Index, die Integritätsregel oder der Schlüssel gelöscht werden, bevor die Spalte gelöscht werden kann. Dadurch werden die Prüf-Integritätsregeln, welche diese Spalte referenzieren, nicht gelöscht.
DROP UNIQUE ( column-name ... ) Löscht die Eindeutigkeits-Integritätsregeln für die angegebene(n) Spalte(n). Alle Fremdschlüssel, die sich auf diese Eindeutigkeits-Integritätsregel beziehen, werden auch gelöscht. DELETE UNIQUE ( column-name ... ) wird ebenfalls akzeptiert.
DROP FOREIGN KEY fkey-name Löscht den angegebenen Fremdschlüssel. DELETE FOREIGN KEY fkey-name wird ebenfalls akzeptiert.
DROP PRIMARY KEY Löscht den Primärschlüssel. Alle Fremdschlüssel, die sich auf den Primärschlüssel für diese Tabelle beziehen, werden auch gelöscht. DELETE PRIMARY KEY wird ebenfalls akzeptiert.
Umbenennungsklauseln Im folgenden Abschnitt werden die Klauseln erklärt, die zum Umbenennen von Teilen einer Spalten- oder Definition verwendet werden:
RENAME new-table-name Ändert den Namen einer Tabelle in new-table-name. Alle Anwendungen, die den alten Tabellennamen benutzen, müssen ebenfalls geändert werden.
RENAME column-name TO new-column-name Ändert den Namen der Spalte in new-column-name. Alle Anwendungen, die den alten Spaltennamen benutzen, müssen ebenfalls geändert werden.
RENAME CONSTRAINT constraint-name TO new-constraint-name Ändert den Namen der Integritätsregel in new-constraint-name.
ALTER TABLE...RENAME CONSTRAINT constraint-name TO new-constraint-name benennt bei Anwendung auf eine RI-Integritätsregel nur die Integritätsregel um. Der darunterliegende Index oder, gegebenenfalls, der Fremdschlüssel-Rollenname bleibt davon unberührt. Wenn Sie den darunterliegenden Index umbenennen oder den Rollennamen ändern möchten, verwenden Sie die ALTER INDEX-Anweisung.
table-alteration-Klauseln Verwenden Sie diese Klausel, um die nachstehenden Tabellenattribute zu ändern.
PCTFREE DEFAULT Verwenden Sie diese Klausel, um die PCTFREE-Einstellung für die Tabelle auf den Standardwert zu setzen (200 Byte für eine 4-kB-Seitengröße und höher).
[ NOT ] ENCRYPTED Verwenden Sie diese Klausel, um die Einstellung in Bezug auf die Tabellenverschlüsselung zu ändern. Um eine Tabelle zu verschlüsseln, muss die Tabellenverschlüsselung in der Datenbank aktiviert sein. Die Verschlüsselung erfolgt unter Verwendung des Chiffrierschlüssels und des Algorithmus, die bei der Datenbankerstellung festgelegt wurden.
Nach dem Verschlüsseln einer Tabelle bleiben Daten für diese Tabelle, die sich vor dem Verschlüsseln in temporären Dateien oder im Transaktionslog befanden, weiterhin unverschlüsselt zugänglich. Um dies zu verhindern, starten Sie die Datenbank neu, damit die temporären Dateien entfernt werden. Führen Sie das Sicherungsdienstprogramm (dbbackup) mit der Option -o aus oder verwenden Sie die BACKUP-Anweisung, um das Transaktionslog zu sichern und ein neues zu starten.
Wenn die Tabellenverschlüsselung aktiviert ist, werden Tabellenseiten für die verschlüsselte Tabelle, zugeordnete Indexseiten, Seiten der temporären Tabelle und Transaktionslogseiten, die Transaktionen von verschlüsselten Tabellen enthalten, verschlüsselt.
DISABLE VIEW DEPENDENCIES-Klausel Verwenden Sie diese Klausel, um abhängige reguläre Ansichten zu deaktivieren. Abhängige materialisierte Ansichten werden nicht deaktiviert. Sie müssen jede abhängige materialisierte Ansicht deaktivieren, in dem Sie die Anweisung ALTER MATERIALIZED VIEW...DISABLE ausführen.
Die ALTER TABLE-Anweisung ändert Tabellenattribute (Spaltendefinitionen, Integritätsregeln usw.) in einer bestehenden Tabelle.
Der Datenbankserver protokolliert Objektabhängigkeiten in der Datenbank. Änderungen am Schema einer Tabelle können sich auf abhängige Ansichten auswirken. Wenn materialisierte Ansichten vorhanden sind, die von der zu ändernden Tabelle abhängen, müssen Sie diese zuerst deaktivieren. Hierfür verwenden Sie die ALTER MATERIALIZED VIEW...DISABLE-Anweisung.
ALTER TABLE kann nicht für eine lokale, temporäre Tabelle verwendet werden.
ALTER TABLE wird verhindert, wenn die Anweisung eine Tabelle betrifft, die zeitgleich von einer anderen Verbindung benutzt wird. ALTER TABLE kann zeitaufwändig sein. Der Datenbankserver verarbeitet während der Anweisungsverarbeitung keine Anforderungen, die sich auf die Tabelle beziehen.
Wenn Sie eine Spalte ändern, für die ein als IMMEDIATE REFRESH festgelegter Textindex besteht, wird der Textindex sofort neu aufgebaut. Wenn der Textindex als AUTO REFRESH oder MANUAL REFRESH definiert ist, wird der Textindex bei der nächsten Aktualisierung neu aufgebaut.
Wenn Sie die ALTER TABLE-Anweisung ausführen, versucht der Datenbankserver, Spaltenberechtigungen für abhängige Ansichten wiederherzustellen, die automatisch neu kompiliert werden. Berechtigungen für Spalten, die in den neu kompilierten Ansichten nicht mehr existieren, gehen verloren.
Eine der folgenden Bedingungen muss erfüllt sein:
Eigentümer der Tabelle
Benutzer mit DBA-Berechtigung
Ein Benutzer, der die Berechtigung ALTER für die Tabelle erhalten hat
ALTER TABLE erfordert exklusiven Zugriff auf die Tabelle.
Globale temporäre Tabellen können erst geändert werden, wenn alle Benutzer, welche die Tabelle referenzieren, ihre Verbindungen getrennt haben.
Kann nicht mit einer Snapshot-Transaktion verwendet werden.
Automatisches Festschreiben (Autocommit).
Ein Checkpoint wird zu Beginn des ALTER TABLE-Vorgangs ausgeführt, und weitere Checkpoints werden vorübergehend unterbrochen, bis der ALTER TABLE-Vorgang abgeschlossen ist.
Sobald Sie eine Spalte oder Tabelle ändern, wird möglicherweise die Ausführung aller gespeicherten Prozeduren, Ansichten oder sonstigen Elemente, welche die geänderte Spalte referenzieren, beendet.
Wenn Sie die deklarierte Länge oder den Typ einer Spalte ändern oder eine Spalte löschen, wird die Statistik für diese Spalte gelöscht.
SQL/2008 ALTER TABLE ist eine Kernfunktion. Im SQL/2008-Standard werden ADD COLUMN und DROP COLUMN als Kernfunktionen unterstützt, wie auch ADD CONSTRAINT und DROP CONSTRAINT. ALTER [COLUMN] ist SQL-Funktion F381, wie auch die Möglichkeit, einen DEFAULT-Wert für eine Spalte hinzuzufügen, zu ändern oder zu löschen. In SQL/2008 erfolgt das Ändern des Datentyps einer Spalte mithilfe der SET DATA TYPE-Klausel, bei der es sich um SQL-Sprachenfunktion F382 handelt. Im Gegensatz dazu wird in SQL Anywhere das direkte Ändern des Datentyps einer Spalte durch die ALTER-Klausel unterstützt.
Andere von SQL Anywhere unterstützte Klauseln, einschließlich ALTER CONSTRAINT, RENAME, PCTFREE, ENCRYPTED und DISABLE MATERIALIZED VIEW, sind Erweiterungen des Herstellers. Die Unterstützung für Erweiterungen von Spaltendefinitionen sowie Integritätsregeldefinitionen für Spalten und Tabellen sind Herstellererweiterungen des SQL/2008-Standards oder spezifische optionale Funktionen von SQL/2008.
Transact-SQL ALTER TABLE wird von Adaptive Server Enterprise unterstützt. Adaptive Server Enterprise unterstützt die Klauseln ADD COLUMN und DROP COLUMN zusätzlich zu ADD CONSTRAINT und DROP CONSTRAINT. Adaptive Server Enterprise verwendet für die ALTER-Klausel MODIFY und nicht das Schlüsselwort ALTER. Adaptive Server Enterprise verwendet die REPLACE-Klausel zum Ändern des DEFAULT Werts einer Spalte . In Adaptive Server Enterprise wird ALTER TABLE auch zum Aktivieren bzw. Deaktivieren von Triggern für eine bestimmte Tabelle verwendet. Diese Funktion wird in SQL Anywhere nicht unterstützt.
Im folgenden Beispiel wird eine neue Zeitstempelspalte namens TimeStamp der Tabelle Customers hinzugefügt.
ALTER TABLE Customers ADD TimeStamp AS TIMESTAMP DEFAULT TIMESTAMP; |
Im folgenden Beispiel wird die neue Zeitstempelspalte TimeStamp gelöscht, die Sie im vorherigen Beispiel erstellt haben.
ALTER TABLE Customers DROP TimeStamp; |
Die Street-Spalte in der Tabelle Customers kann gegenwärtig bis zu 35 Zeichen enthalten. Damit sie bis zu 50 Zeichen umfassen kann, führen Sie Folgendes aus:
ALTER TABLE Customers ALTER Street CHAR(50); |
Mit dem folgenden Beispiel wird eine Spalte zur Customers-Tabelle eingefügt, wobei jedem Kunden ein "sales contact" (Ansprechpartner) zugewiesen wird.
ALTER TABLE Customers ADD SalesContact INTEGER REFERENCES Employees ( EmployeeID ) ON UPDATE CASCADE ON DELETE SET NULL; |
Dieser Fremdschlüssel wurde mit kaskadierenden Aktualisierungen konstruiert und wird bei Löschungen auf NULL gesetzt. Wenn sich die Mitarbeiterkennung eines Angestellten ändert, wird die Spalte entsprechend aktualisiert. Wenn ein Angestellter das Unternehmen verlässt und seine Kennung gelöscht wird, wird die Spalte auf den Wert NULL gesetzt.
Im folgenden Beispiel wird ein Fremdschlüssel FK_SalesRepresentative_EmployeeID2, für die Spalte SalesOrders.SalesRepresentative erstellt und mit Employees.EmployeeID verknüpft:
ALTER TABLE GROUPO.SalesOrders ADD CONSTRAINT FK_SalesRepresentative_EmployeeID2 FOREIGN KEY ( SalesRepresentative ) REFERENCES GROUPO.Employees (EmployeeID); |
Im folgenden Beispiel wird eine Spalte hinzugefügt, in der der Standardwert AUTOINCREMENT ist. In diesem Beispiel werden alle bestehenden Kundenzeilen geändert, um eine nullwertfähige AUTOINCREMENT-Spalte mit zugeordnetem Spaltenwert zu erhalten, aber der Datenbankserver garantiert nicht, welcher Zeile welcher Wert zugeordnet ist:
ALTER TABLE Customers ADD Surrogate_key INTEGER DEFAULT AUTOINCREMENT; |
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |