:: DEVELOPER ZONE
ALTER [IGNORE] TABLE tabelle aenderungs_angabe [, aenderungs_angabe ...]
aenderungs_angabe:
ADD [COLUMN] create_definition [FIRST | AFTER spalten_name]
oder ADD [COLUMN] (create_definition, create_definition,...)
oder ADD INDEX [index_name] (index_spalten_name,...)
oder ADD PRIMARY KEY (index_spalten_name,...)
oder ADD UNIQUE [index_name] (index_spalten_name,...)
oder ADD FULLTEXT [index_name] (index_spalten_name,...)
or ADD [CONSTRAINT symbol] FOREIGN KEY index_name (index_spalten_name,...)
[referenz_definition]
oder ALTER [COLUMN] spalten_name {SET DEFAULT literal | DROP DEFAULT}
oder CHANGE [COLUMN] alter_spalten_name create_definition
oder MODIFY [COLUMN] create_definition
oder DROP [COLUMN] spalten_name
oder DROP PRIMARY KEY
oder DROP INDEX index_name
oder DISABLE KEYS
oder ENABLE KEYS
oder RENAME [TO] neue_tabelle
oder ORDER BY spalte
oder tabellen_optionen
Mit ALTER TABLE können Sie die Struktur einer bestehenden Tabelle
ändern. Sie können beispielsweise Spalten hinzufügen oder löschen, Indexe
erzeugen oder löschen, den Typ bestehender Spalten ändern oder Spalten oder
die Tabelle selbst umbenennen. Sie können auch den Kommentar für die
Tabelle und den Typ der Tabelle ändern. See Abschnitt 7.5.3, „CREATE TABLE-Syntax“.
Wenn Sie ALTER TABLE benutzen, um eine Spaltenspezifikation zu
ändern, und DESCRIBE tabelle anzeigt, dass die Spalte nicht geändert
wurde, ist es möglich, dass MySQL Ihre Änderungen aus einem der Gründe
ignoriert hat, die in Abschnitt 7.5.3.1, „Stille Spaltentyp-Änderungen“ beschrieben sind.
Wenn Sie beispielsweise versuchen, eine VARCHAR-Spalte zu
CHAR zu ändern, benutzt MySQL dennoch VARCHAR, wenn die
Tabelle weitere Spalten variabler Länge enthält.
ALTER TABLE funktioniert mittels Anlegen einer temporären Kopie der
Original-Tabelle. Die Änderungen werden an der Kopie durchgeführt, dann
wird die Original-Tabelle gelöscht und die neue umbenannt. Das wird so
durchgeführt, dass alle Aktualisierungen automatisch ohne irgend welche
fehlgeschlagenen Aktualisierungen an die neue Tabelle weitergeleitet
werden. Während ALTER TABLE ausgeführt wird, ist die alte Tabelle
durch andere Clients lesbar. Aktualisierungen und Schreibvorgänge in die
Tabelle werden angehalten, bis die neue Tabelle bereit ist.
Beachten Sie, dass MySQL immer eine temporäre Tabelle anlegt, wenn Sie für
ALTER TABLE irgend eine Option ausser RENAME angeben, selbst
wenn die Daten eigentlich nicht kopiert werden müssten (zum Beispiel, wenn
Sie einen Spaltennamen ändern). Wir planen, dass zu beheben, aber da man
ALTER TABLE normalerweise nicht ausführen muss, ist das auf unserer
TODO-Liste nicht sehr hoch angesetzt.
Um ALTER TABLE ausführen zu können, benötigen Sie ALTER-,
INSERT- und CREATE-Berechtigungen für die Tabelle.
IGNORE ist eine MySQL-Erweiterung zu ANSI-SQL92. Es steuert, wie
ALTER TABLE funktioniert, wenn es in der neuen Tabelle Duplikate auf
eindeutigen Schlüsseln gibt. Wenn IGNORE nicht angegeben wird, wird
das Kopieren abgebrochen und zurückgesetzt. Wenn IGNORE angegeben
wird, wird bei Zeilen mit Duplikaten auf einem eindeutigen Schlüssel nur
die erste Zeile benutzt, die anderen werden gelöscht.
Sie können mehrfache ADD-, ALTER-, DROP- und
CHANGE-Klauseln in einem einzigen ALTER TABLE-Statement
angeben. Das ist eine MySQL-Erweiterung zu ANSI-SQL92, welches nur eine
Klausel pro ALTER TABLE-Statement zuläßt.
CHANGE spalten_name, DROP spalten_name und DROP INDEX
sind MySQL-Erweiterungen zu ANSI-SQL92.
MODIFY ist eine Oracle-Erweiterung zu ALTER TABLE.
Das optionale Wort COLUMN kann weggelassen werden.
Wenn Sie ALTER TABLE tabelle RENAME TO neuer_name ohne weitere
Optionen benutzen, benennt MySQL einfach die Dateien um, die der Tabelle
tabelle entsprechen. Es besteht keine Notwendigkeit, die temporäre
Tabelle zu erzeugen. See Abschnitt 7.5.5, „RENAME TABLE-Syntax“.
Ab MySQL 4.0 kann das obige Feature explizit aktiviert werden.
ALTER TABLE ... DISABLE KEYS veranlasst MySQL, mit dem Aktualisieren
nicht eindeutiger Indexe für die MyISAM-Tabelle aufzuhören. Dann
sollte ALTER TABLE ... ENABLE KEYS benutzt werden, um fehlende
Indexe wieder zu erzeugen. Weil MySQL das mit Algorithmen durchführt, die
viel schneller sind als das Einfügen von Schlüsseln nacheinander, kann das
Abschalten von Schlüsseln bei Masseneinfügeoperationen erheblich
Geschwindigkeitsvorteile bringen.
create_definition-Klauseln benutzen dieselbe Syntax für ADD
und CHANGE wie bei CREATE TABLE. Beachten Sie, dass diese
Syntax den Spaltenname beinhaltet, nicht nur den Spaltentyp.
Sie können eine Spalte mit einer CHANGE alter_spalten_name create_definition-Klausel umbenennen. Um das zu tun, geben Sie den alten
und den neuen Spaltennamen und den Typ an, den die Spalte momentan hat. Um
beispielsweise eine INTEGER-Spalte von a nach b
umzubenennen, tun Sie folgendes:
mysql> ALTER TABLE t1 CHANGE a b INTEGER;
Wenn Sie einen Spaltentyp, nicht aber den Namen ändern wollen, benötigt
CHANGE dennoch zwei Spaltennamen, selbst wenn sie dieselben sind.
Beispiel:
mysql> ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;
Ab MySQL-Version 3.22.16a können Sie jedoch auch MODIFY benutzen, um
einen Spaltentyp ohne Umbenennung zu ändern:
mysql> ALTER TABLE t1 MODIFY b BIGINT NOT NULL;
Wenn Sie CHANGE oder MODIFY benutzen, um eine Spalte zu
kürzen, für die es einen Index auf einem Teil der Spalte gibt (wenn Sie zum
Beispiel einen Index auf den ersten 10 Zeichen einer VARCHAR-Spalte
haben), können Sie die Spalte nicht kürzer als die Anzahl von Zeichen
machen, die indiziert sind.
Wenn Sie versuchen, einen Spaltentyp mit CHANGE oder MODIFY
zu ändern, versucht MySQL, Daten so umzuwandeln, dass sie so gut wie
möglich zum neuen Typ passen.
AB MySQL-Version 3.22 können Sie FIRST oder ADD ... AFTER spalten_name benutzen, um eine Spalte an einer bestimmten Position
innerhalb einer Tabellenzeile einzufügen. Vorgabemäßig wird die Spalte am
Ende hinzugefügt.
ALTER COLUMN gibt einen Vorgabewert für eine Spalte an oder entfernt
den alten Vorgabewert. Wenn der alte Vorgabewert entfernt wird und die
Spalte NULL sein darf, ist der neue Vorgabewert NULL. Wenn
die Spalte nicht NULL sein darf, weist MySQL einen Vorgabewert zu,
wie in Abschnitt 7.5.3, „CREATE TABLE-Syntax“ beschrieben.
DROP INDEX entfernt einen Index. Das ist eine MySQL-Erweiterung zu
ANSI-SQL92. See Abschnitt 7.5.8, „DROP INDEX-Syntax“.
Wenn Spalten aus einer Tabelle gelöscht werden, werden sie auch aus jeglichen Indexen entfernt, deren Teil sie sind. Wenn alle Spalten, aus denen ein Index besteht, gelöscht werden, wird der Index ebenfalls gelöscht.
Wenn eine Tabelle nur eine Spalte enthält, kann die Spalte nicht gelöscht
werden. Wenn Sie beabsichtigen, die Tabelle zu entfernen, benutzen Sie
statt dessen DROP TABLE.
DROP PRIMARY KEY löscht den Primärschlüssel. Wenn es keinen solchen
gibt, löscht es den ersten UNIQUE-Index in der Tabelle. (MySQL
kennzeichnet den ersten UNIQUE-Schlüssel als PRIMARY KEY,
wenn PRIMARY KEY nicht explizit angegeben wurde.)
Wenn Sie einen UNIQUE INDEX oder PRIMARY KEY zu einer Tabelle
hinzufügen, wird dieser vor jedem Nicht-UNIQUE-Index gespeichert, so
dass MySQL doppelte Schlüsseleinträge so früh wie möglich feststellen kann.
ORDER BY gestattet Ihnen, eine Tabelle mit Zeilen in einer
bestimmten Reihenfolge zu erzeugen. Beachten Sie, dass die Tabelle nach
INSERTs und DELETEs nicht in dieser Reihenfolge verbleibt. In einigen
Fällen kann es das Sortieren für MySQL erleichtern, wenn die Tabelle nach
der Spalte geordnet ist, nach der Sie sie später ordnen wollen. Diese
Option ist hauptsächlich nützlich, wenn Sie wissen, dass Sie die Zeilen
meistens in einer bestimmten Reihenfolge abfragen werden. Wenn Sie diese
Option nach großen Änderungen in der Tabelle benutzen, können Sie
möglicherweise eine höhere Performance erzielen.
Wenn Sie ALTER TABLE auf einer MyISAM-Tabelle benutzen,
werden alle nicht eindeutigen Indexe in einem separaten Stapellauf erzeugt
(wie bei REPAIR). Das sollte ALTER TABLE viel schneller
machen, wenn Sie viele Indexe haben.
Ab MySQL 4.0 kann dies explizit aktiviert werden. ALTER TABLE ... DISABLE KEYS veranlasst MySQL, mit der Aktualisierung nicht
eindeutiger Indexe für MyISAM-Tabellen aufzuhören. ALTER TABLE ... ENABLE KEYS sollte dann benutzt werden, um fehlende Indexe wieder zu
erzeugen. Weil MySQL das mit Algorithmen durchführt, die viel schneller
sind als das Einfügen von Schlüsseln nacheinander, kann das Abschalten von
Schlüsseln bei Masseneinfügeoperationen erheblich Geschwindigkeitsvorteile
bringen.
Mit der C-API-Funktion mysql_info() können Sie herausfinden, wie
viele Datensätze kopiert wurden und (wenn IGNORE benutzt wird) wie
viele Datensätze aufgrund der Duplizierung eindeutiger Schlüsselwerte
gelöscht wurden.
Die FOREIGN KEY-, CHECK- und REFERENCES-Klauseln
machen nichts. Die Syntax für sie steht nur aus Kompatibilitätsgründen
bereit, um das Portieren von Code von anderen SQL-Servern zu erleichtern
und um Applikationen laufen zu lassen, die Tabellen mit Referenzen
erzeugen.
Hier ist ein Beispiel, das einige der Anwendungsfälle von ALTER TABLE zeigt. Wir fangen mit einer Tabelle t1 an, die wie folgt
erzeugt wird:
mysql> CREATE TABLE t1 (a INTEGER,b CHAR(10));
Um die Tabelle von t1 nach t2 umzubenennen, geben Sie ein:
mysql> ALTER TABLE t1 RENAME t2;
Um Spalte a von INTEGER nach TINYINT NOT NULL zu
ändern (der Name bleibt derselbe) und Spalte b von CHAR(10)
nach CHAR(20) zu ändern und gleichzeitig von b nach c
umzubenennen, geben Sie ein:
mysql> ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);
Jetzt wird eine TIMESTAMP-Spalte namens d hinzugefügt:
mysql> ALTER TABLE t2 ADD d TIMESTAMP;
Nunmehr erzeugen wir einen Index auf Spalte d und machen Spalte
a zum Primärschlüssel:
mysql> ALTER TABLE t2 ADD INDEX (d), ADD PRIMARY KEY (a);
Wir entfernen Spalte c:
mysql> ALTER TABLE t2 DROP COLUMN c;
Und fügen eine neue AUTO_INCREMENT-Ganzzahl-Spalte namens c
hinzu:
mysql> ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT,
ADD INDEX (c);
Beachten Sie, dass wir c indiziert haben, weil
AUTO_INCREMENT-Spalten indiziert sein müssen, und auch, dass wir
c als NOT NULL deklariert haben, weil indizierte Spalten
nicht NULL sein dürfen.
Wenn Sie eine AUTO_INCREMENT-Spalte hinzufügen, werden automatisch
Spaltenwerte mit Zahlenfolgen eingefügt. Sie können die erste Zahl setzen,
indem Sie SET INSERT_ID=# vor ALTER TABLE ausführen oder
indem Sie die AUTO_INCREMENT = #-Tabellenoption benutzen.
See Abschnitt 6.5.6, „SET-Syntax“.
Wenn Sie bei MyISAM-Tabellen nicht die AUTO_INCREMENT-Spalte ändern,
ist die Folgezahl davon nicht betroffen. Wenn Sie eine
AUTO_INCREMENT-Spalte löschen und dann eine weitere
AUTO_INCREMENT-Spalte hinzufügen, fangen die Zahlen wieder bei 1 an.
© 1995-2005 MySQL AB. All rights reserved.
