Instructiunea ALTER TABLE ofera posibilitatea modificarii structurii unui tabel existent, astfel: prin adaugarea sau stergerea unor coloane, modificarea tipului de date sau a caracteristicilor pentru anumite coloane, redenumirea anumitor coloane sau chiar redenumirea tabelului in cauza.
ALTER TABLE nume_tabel specificatie_modificare1, [specificatie_modificare2], ...
specificatie_modificare: ADD [COLUMN] nume_coloana definitie_coloana [FIRST | AFTER nume_coloana ] ADD [COLUMN] (nume_coloana definitie_coloana, ...) ALTER [COLUMN] nume_coloana {SET DEFAULT literal | DROP DEFAULT} CHANGE [COLUMN] nume_vechi_coloana nume_nou_coloana definitie [FIRST | AFTER nume_coloana] MODIFY [COLUMN] nume_coloana definitie_coloana [FIRST | AFTER nume_coloana] DROP [COLUMN] nume_coloana RENAME [TO] nume_nou_tabel
In cadrul sistemelor MySQL, intr-o instructiune ALTER TABLE pot fi utilizate oricate optiuni ADD, ALTER, CHANGE si/sau DROP, spre deosebire de standardul SQL, care nu accepta decat o singura optiune de acest fel in interiorul unei instructiuni ALTER TABLE. Termenul COLUMN este optional si poate fi omis. Definitia unei coloane, specificata in optiunile ADD sau CHANGE, este asemanatoare cu definitia unei coloane din instructiunea CREATE TABLE.
Optiunea ADD COLUMN permite adaugarea unei noi coloane pentru un tabel si presupune precizarea unui nume si a unei descrieri pentru noua coloana. Pentru pozitionarea acestei coloane in tabel pot fi utilizate clauzele FIRST, pentru prima pozitie in tabel, respectiv AFTER nume_coloana, pentru pozitionarea dupa o anumita coloana.
Adaugarea unei noi coloane, country_native, in tabelul country din baza de date sakila se realizeaza prin intermediul intructiunii ALTER TABLE cu sintaxa de mai jos. Pozitionarea acestei coloane dupa campul country presupune precizarea clauzei AFTER country.
mysql> ALTER TABLE sakila.country -> ADD COLUMN country_native varchar(50) AFTER country;
mysql> DESCRIBE sakila.country; +----------------+----------------------+------+-----+-------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +----------------+----------------------+------+-----+-------------------+-----------------------------+ | country_id | smallint(5) unsigned | NO | PRI | NULL | auto_increment | | country | varchar(50) | NO | | NULL | | | country_native | varchar(50) | YES | | NULL | | | last_update | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | +----------------+----------------------+------+-----+-------------------+-----------------------------+
Optiuna ALTER COLUMN specifica o noua valoare implicita sau sterge valoarea implicita pentru o coloana. Daca valoarea implicita este stearsa si coloana poate accepta valori NULL, atunci noua valoare implicita este NULL.
mysql> ALTER TABLE sakila.country -> ALTER COLUMN last_update DROP DEFAULT;
mysql> DESCRIBE sakila.country; +----------------+----------------------+------+-----+---------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +----------------+----------------------+------+-----+---------+-----------------------------+ | country_id | smallint(5) unsigned | NO | PRI | NULL | auto_increment | | country | varchar(50) | NO | | NULL | | | country_native | varchar(50) | YES | | NULL | | | last_update | timestamp | NO | | NULL | on update CURRENT_TIMESTAMP | +----------------+----------------------+------+-----+---------+-----------------------------+
Optiunea CHANGE COLUMN permite modificarea numelui si/sau a descrierii pentru o coloana. Chiar daca se modifica doar caracteristicile coloanei, trebuie precizate valori pentru nume_vechi_coloana, respectiv nume_nou_coloana. La modificarea tipului de date pentru o coloana, prin intermediul optiunilor CHANGE sau MODIFY, pot aparea si modificari ale datelor continute in coloana.
mysql> ALTER TABLE sakila.country -> CHANGE COLUMN country country_name varchar(50) NOT NULL;
mysql> DESCRIBE sakila.country; +----------------+----------------------+------+-----+---------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +----------------+----------------------+------+-----+---------+-----------------------------+ | country_id | smallint(5) unsigned | NO | PRI | NULL | auto_increment | | country_name | varchar(50) | NO | | NULL | | | country_native | varchar(50) | YES | | NULL | | | last_update | timestamp | NO | | NULL | on update CURRENT_TIMESTAMP | +----------------+----------------------+------+-----+---------+-----------------------------+
Optiuna MODIFY COLUMN permite modificarea caracteristicilor pentru o coloana. Daca se utilizeaza optiunile CHANGE sau MODIFY, definitia coloanei trebuie sa includa atat tipul de date, cat si toate atributele care se aplica pentru noua structura a coloanei, altele decat PRIMARY KEY. Atributele prezente in definitia initiala a coloanei, care nu sunt specificate in noua definitie, nu sunt pastrate.
mysql> ALTER TABLE sakila.country -> MODIFY COLUMN country_native varchar(50) NOT NULL;
mysql> DESCRIBE sakila.country; +----------------+----------------------+------+-----+---------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +----------------+----------------------+------+-----+---------+-----------------------------+ | country_id | smallint(5) unsigned | NO | PRI | NULL | auto_increment | | country_name | varchar(50) | NO | | NULL | | | country_native | varchar(50) | NO | | NULL | | | last_update | timestamp | NO | | NULL | on update CURRENT_TIMESTAMP | +----------------+----------------------+------+-----+---------+-----------------------------+
DROP COLUMN permite stergerea unei coloane dintr-un tabel. Cuvantul cheie COLUMN este optional.
mysql> ALTER TABLE sakila.country -> DROP COLUMN country_native;
mysql> DESCRIBE sakila.country; +--------------+----------------------+------+-----+---------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +--------------+----------------------+------+-----+---------+-----------------------------+ | country_id | smallint(5) unsigned | NO | PRI | NULL | auto_increment | | country_name | varchar(50) | NO | | NULL | | | last_update | timestamp | NO | | NULL | on update CURRENT_TIMESTAMP | +--------------+----------------------+------+-----+---------+-----------------------------+
RENAME permite modificarea denumirii pentru un tabel. Aceasta optiune poate fi utilizata in cazul in care nu sunt prezente alte optiuni ale instructiunii ALTER TABLE. Modificarea denumirii, pentru un tabel, poate fi realizata si prin intermediul instructiunii RENAME TABLE. Privilegiile specificate pentru numele tabelului redenumit nu sunt transferate in mod automat pentru noua denumire a tabelului. Transferul privilegiilor se realizeaza, in acest caz, manual.
mysql> ALTER TABLE sakila.country -> RENAME TO sakila.countries;
Instructiunea ALTER TABLE creeaza o copie temporara a tabelului initial. Operatia se desfasoara astfel: se fac modificari asupra copiei, este sters tabelul initial, iar noul tabel este redenumit. In timpul executiei instructiunii ALTER TABLE, tabelul initial poate fi doar citit in alte sesiuni. Operatiile de actualizare sau inserare de pe server sunt suspendate pana in momentul in care noul tabel este disponibil.