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.

Vedi anche

Commenti

Sto caricando i commenti......
Content reproduced on this site is the property of its respective owners, and this content is not reviewed in advance by MariaDB. The views, information and opinions expressed by this content do not necessarily represent those of MariaDB or any other party.