ALTER TABLE
Sintassi
ALTER [ONLINE] [IGNORE] TABLE nome_tabella
specifica_alter [, specifica_alter] ...
specifica_alter:
opzione_tabella ...
| ADD [COLUMN] nome_colonna definizione_colonna
[FIRST | AFTER nome_colonna ]
| ADD [COLUMN] (nome_colonna definizione_colonna,...)
| ADD {INDEX|KEY} [nome_indice]
[tipo_indice] (nome_colonna_indice,...) [nome_indice] ...
| ADD [CONSTRAINT [symbol]] PRIMARY KEY
[tipo_indice] (nome_colonna_indice,...) [nome_indice] ...
| ADD [CONSTRAINT [symbol]]
UNIQUE [INDEX|KEY] [nome_indice]
[tipo_indice] (nome_colonna_indice,...) [nome_indice] ...
| ADD FULLTEXT [INDEX|KEY] [nome_indice]
(nome_colonna_indice,...) [opzione_indice] ...
| ADD SPATIAL [INDEX|KEY] [nome_indice]
(nome_colonna_indice,...) [opzione_indice] ...
| ADD [CONSTRAINT [simbolo]]
FOREIGN KEY [tipo_indice] (nome_colonna_indice,...)
definizione_riferimento
| ALTER [COLUMN] nome_colonna {SET DEFAULT letterale | DROP DEFAULT}
| CHANGE [COLUMN] vecchio_nome_colonna nuovo_nome_colonna definizione_colonna
[FIRST|AFTER nome_colonna ]
| MODIFY [COLUMN] nome_colonna column_definition
[FIRST | AFTER nome_colonna ]
| DROP [COLUMN] nome_colonna
| DROP PRIMARY KEY
| DROP {INDEX|KEY} nome_indice
| DROP FOREIGN KEY simbolo_fk
| DISABLE KEYS
| ENABLE KEYS
| RENAME [TO] nuovo_nome_tabella
| ORDER BY nome_colonna [, nome_colonna] ...
| CONVERT TO CHARACTER SET nome_charset [COLLATE nome_collation]
| [DEFAULT] CHARACTER SET [=] nome_charset [COLLATE [=] nome_collation]
| DISCARD TABLESPACE
| IMPORT TABLESPACE
| opzioni_partizione
| ADD PARTITION (definizione_partizione)
| DROP PARTITION nomi_partizioni
| COALESCE PARTITION numero
| REORGANIZE PARTITION [partition_names INTO (definizioni_partizioni)]
| ANALYZE PARTITION nomi_partizioni
| CHECK PARTITION nomi_partizioni
| OPTIMIZE PARTITION nomi_partizioni
| REBUILD PARTITION nomi_partizioni
| REPAIR PARTITION nomi_partizioni
| REMOVE PARTITIONING
definizione_colonna:
tipo_dato [NOT NULL | NULL] [DEFAULT valore_default]
[AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY]
[COMMENT 'stringa']
[COLUMN_FORMAT {FIXED|DYNAMIC|DEFAULT}]
[STORAGE {DISK|MEMORY|DEFAULT}]
| tipo_dato [GENERATED ALWAYS] AS ( <espressione> ) {VIRTUAL | PERSISTENT}
[UNIQUE] [UNIQUE KEY] [COMMENT 'string']
nome_colonna_indice:
nome_colonna [(length)] [ASC | DESC]
tipo_indice:
USING {BTREE | HASH | RTREE}
opzione_indice:
KEY_BLOCK_SIZE [=] valore
| index_type
| WITH PARSER nome_parser
| COMMENT 'stringa'
Spiegazione
ALTER TABLE serve a modificare la struttura di una tabella esistente. Ad esempio è possibile aggiungere o eliminare colonne, creare o distruggere indici, modificare il tipo delle colonne esistenti, rinominare le colonne o rinominare la tabella stessa. E' possibile modificare il commento della tabella o il suo Storage Engine.
Tipi di indici
Si veda I tipi di indici degli Storage Engine per sapere quali tipi di indici sono accettati dai vari Storage Engine.
In quali casi con ALTER TABLE si copiano tutti i dati?
MySQL e MariaDB hanno sempre avuto un ALTER TABLE molto ricco. E' possibile ottenere con un solo comando tutte le modifiche desiderate. Il rovescio della medaglia è che, proprio per questo motivo, nella maggioranza dei casi ALTER TABLE esegue una copia completa della tabella; questo può richiedere molto tempo, se la tabella è di grandi dimensioni.
Con il tempo, un sempre maggiore numero di operazioni verrà eseguito online (eseguite tutte in una volta, o almeno molto rapidamente). Ecco una lista delle operazioni che vengono effettuate 'tutte in una volta' senza copiare la tabella:
- Modifica del nome di una colonna
- Modifica delle dimensioni di un intero, come INT(2) -> INT(3)
- Modifica del commento
- Aggiunta di un nuovo membro in fondo ad una lista ENUM
- Modifica del nome di una tabella
In MariaDB 5.3, è possibile usare ALTER ONLINE TABLE per accertarsi che il comando sia istantaneo; se questo non è possibile, viene generato un errore:
create table t1 (a int, e enum ('rosso','verde'));
alter online table t1 modify e enum('rosso','verde','blu');
-> Query OK, 0 rows affected (0.11 sec)
-> Records: 0 Duplicates: 0 Warnings: 0
alter online table t1 add c int;
-> ERROR 1656 (HY000): Can't execute the given 'ALTER' command as online
Progress Report
In MariaDB 5.3 è possibile ottenere un progress report nei client che supportano il nuovo protocollo, quando si esegue ALTER TABLE. Dal client mysql:
MariaDB> alter table test engine=Aria; Stage: 1 of 2 'copy to tmp table' 46% of stage
Il progress report è visibile anche con l'istruzione SHOW PROCESSLIST o interrogando la tabella information_schema.processlist.