alter_specification:
ADD [COLUMN] create_definition [FIRST | AFTER column_name ]
oder ADD INDEX [index_name] (index_col_name,...)
oder ADD PRIMARY KEY (index_col_name,...)
oder ADD UNIQUE [index_name] (index_col_name,...)
oder ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
oder CHANGE [COLUMN] old_col_name create_definition
oder MODIFY [COLUMN] create_definition
oder DROP [COLUMN] col_name
oder DROP PRIMARY KEY
oder DROP INDEX key_name
oder RENAME [AS] new_tbl_name
oder table_option
ALTER erlaubt es, die Struktur einer Tabelle vollständig
zu verändern. Intern legt MySQL eine temporäre Kopie dieser
Tabelle an, verändert die Struktur und kopiert die Daten
wieder zurück. Bei großen Datenbanken kann dies erhebliche
Zeit in Anspruch nehmen.
mysql> CREATE TABLE t1 (a INTEGER,b CHAR(10));
Um Tabelle von t1 nach t2 umzubenennen:
mysql> ALTER TABLE t1 RENAME t2;
Um z.B. eine INTEGER Spalte von a nach b umzubenennen:
mysql> ALTER TABLE t1 CHANGE a b INTEGER;
Um einen Spaltentyp zu verändern, ohne den Namen zu verändern:
mysql> ALTER TABLE t1 CHANGE b b INTEGER;
Ab Version 3.22.16a funktioniert auch folgende Syntax:
mysql> ALTER TABLE t1 MODIFY b INTEGER;
Um eine Spalte von INTEGER nach TINYINT NOT NULL zu konvertieren,
und gleichzeitig Spalte b von CHAR(10) nach CHAR(20) unter
Umbenennung von b nach c zu verändern:
mysql> ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);
Einfügen einer TIMESTAMP Spalte mit Namen d:
mysql> ALTER TABLE t2 ADD d TIMESTAMP;
Um einen Index an Spalte d anzufügen, und diese als primary
key zu bestimmen:
mysql> ALTER TABLE t2 ADD INDEX (d), ADD PRIMARY KEY (a);
Spalte c Löschen:
mysql> ALTER TABLE t2 DROP COLUMN c;
Hinzufügen einer AUTO_INCREMENT integer Spalte namens
c:
mysql> ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT,
ADD INDEX (c);
Man beachte, daß wir c indiziert haben, weil AUTO_INCREMENT
Spalten zwangsläufig indiziert werden müssen. Wir erklären
c als NOT NULL, weil indizierte Spalten nicht NULL sein
dürfen.
Einige Dinge sollten Sie bei ALTER unbedingt beachten:
- Um ALTER TABLE
verwenden zu können, ist es erforderlich, daß Sie die
Rechte select, insert, delete, update, create und
drop an der Tabelle besitzen. Das ist angesichts
der internen Abläufe in MySQL beim ALTER Statement auch
verständlich.
- IGNORE ist
eine MySQL Erweiterung gegenüber ANSI SQL 92. Sie kontrolliert,
die ALTER TABLE arbeitet, wenn es Duplikate bei UNIXQUE
Keys einer neuen Tabelle gibt. Wenn IGNORE nicht angegeben
ist, wird die Copie abgebrochen und ds Statement ignoriert.
Wenn aber IGNORE angegeben wurde, dann wird nur die erste
Spalte verwendet, wenn ein UNIQUE Key angegeben ist, alle
anderen Spalten werden gelöcht.
- Es dürfen
mehrere ADD, ALTER, DROP und CHANGE Klauseln in einer
einzigen ALTER TABLE Statement verwendet werden.
- CHANGE col_name,
DROP col_name und DROP INDEX sind erweiterungen von MySQL
gegenüber ANSI SQL 92.
- MODIFY ist
eine ORACLE Erweiterung zu ALTER TABLE.
- Das Wort COLUMN
kann auch weggelassen werden.
- Wenn ALTER
TABLE tbl_name RENAME AS neuer_name ohne irgendwelche
Optionen verwendet wird, werden die Dateinamen auf der
Festplatte einfach umbenannt. Es werden keine temporären
Tabellen angelegt, die später eventuell gelöscht werden
müßten.
- Falls durch
CHANGE oder MODIFY eine Spalte verkürtzt wird, auf welchem
ein INDEX liegt, dann wird die Länge nur auf die Länge
des INDEX verkürzt, damit der INDEX noch arbeitsfähig
ist. Andernfalls müssen sie den INDEX löschen, die Spalte
verändern, und den INDEX neu erstellen.
- Mit MySLQ
ab Version 3.22 darf nun der Ausdruck FIRST oder ADD...
AFTER col_name verwendet werden, um eine Spalte nach einer
bestimmten Positeon einzufügen. Standardmäßig wird am
Ende stets eine Spalte angefügt.
- DROP INDEX
entfernt einen INDEX auf einer Spalte
- DROP PRIMARY KEY löscht den primären
INDEX. Falls dieser nicht existiert, so wird diejenige
Spalte verworfen, die den ersten UNIQUE Key ist.
- Mit der C
API Funktion mysql_info() kann man herausfinden, wieviele
Einträge kopiert wurden, und bei der Verwendung von IGNORE
wird angegeben, wieviele Einträge gelöscht wurden.
- Die Ausdrücke
FOREIGN KEY, CHECK und REFERENCES haben keine Funktion.
|
|