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
.