Вы находитесь на странице: 1из 5

ALTER TABLE

ALTER [IGNORE] TABLE tbl_name alter_specification [,


alter_specification ...]

Sintaxis para alter_specification:


ADD [COLUMN] create_definition [FIRST | AFTER column_name ]
| ADD [COLUMN] (create_definition, create_definition,...)
| ADD INDEX [index_name] (index_col_name,...)
| ADD [CONSTRAINT [symbol]] PRIMARY KEY (index_col_name,...)
| ADD [CONSTRAINT [symbol]] UNIQUE [index_name] (index_col_name,...)
| ADD FULLTEXT [index_name] (index_col_name,...)
| ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name]
(index_col_name,...)
[reference_definition]
| ALTER [COLUMN] col_name \
| CHANGE [COLUMN] old_col_name create_definition
[FIRST | AFTER column_name]
| MODIFY [COLUMN] create_definition [FIRST | AFTER column_name]
| DROP [COLUMN] col_name
| DROP PRIMARY KEY
| DROP INDEX index_name
| DISABLE KEYS
| ENABLE KEYS
| RENAME [TO] new_tbl_name
| ORDER BY col
| CHARACTER SET character_set_name [COLLATE collation_name]
| table_options

ALTER TABLE permite modificar la estructura de una tabla existente. Por ejemplo,
se pueden aadir o eliminar columnas, crear y destruir ndices, cambiar el tipo de una
columna existente o renombrar columnas o la propia tabla. Tambin es posible
modificar el comentario y el tipo de la tabla.
Si se usa ALTER TABLE para cambiar la especificacin de una columna pero
tbl_name indica que la columna no ha cambiado, es posible que MySQL haya ignorado
la modificacin por alguna razn. Por ejemplo, si se ha intentado cambiar una
columna VARCHAR a CHAR, MySQL seguir usandoVARCHAR si la tabla contiene
otras columnas de longitud variable.
ALTER TABLE trabaja haciendo una copia temporal de la tabla original. La
modificacin se realiza durante la copia, a continuacin la tabla original se borra y la
nueva se renombra. Esto se hace para realizar que todas las actualizaciones se dirijan a
la nueva tabla sin ningn fallo de actualizacin. MientrasALTER TABLE se ejecuta, la
tabla original permanece accesible en lectura para otros clientes. Las actualizaciones y
escrituras en la tabla se retrasan hasta que la nueva tabla est preparada.

Hay que tener en cuenta que si se usa otra opcin para ALTER
TABLE como RENAME, MySQL siempre crear una tabla temporal, aunque no sea
estrictamente necesario copiarla (como cuando se cambia el nombre de una columna).
Est previsto corregir esto en el futuro, pero como no es corriente usar ALTER
TABLE para hacer esto, no es algo urgente de hacer. Para tablas MyISAM, se puede
aumentar la velocidad de la recreacin de ndices (que es la parte ms lenta del
proceso) asignando un valor alto a la variable myisam_sort_buffer_size.
Para
usar ALTER
TABLE,
es
necesario
tener
los
privilegios ALTER, INSERT y CREATE en la tabla.
IGNORE es una extensin MySQL a SQL-92. Controla el modo de trabajar
de ALTER TABLE si hay claves duplicadas o nicas en la nueva tabla. Si
no se especifica IGNORE, la copia se aborta y se deshacen los cambios. Si
se especifica IGNORE, en las filas duplicadas en una clave nica slo se
copia la primera fila; el resto se eliminan.
Se pueden usar mltiples clasulas ADD, ALTER, DROP y CHANGE en
una sentencia sencilla ALTER TABLE. Esto es una extensin MySQL
aSQL-92, que permite slo una aparicin de cada clusula en una
sentencia ALTER TABLE.
CHANGE col_name, DROP col_name
y DROP INDEX tambin son
extensiones MySQL a SQL-92.
MODIFY es una extensin Oracle a ALTER TABLE.
La palabra opcional COLUMN es una palabra ruidosa y puede ser omitida.
Si se usa ALTER TABLE tbl_name RENAME TO new_name sin
ninguna otra opcin, MySQL sencillamente renombra los ficheros
correspondientes a la tabla tbl_name. No hay necesidad de crear una tabla
temporal.
Las
clasulas create_definition usan
la
misma
sintaxis
para ADD y CHANGE que . Esta sintaxis incluye slo el nombre de
columna, no el tipo.
Se puede renombrar una columna usando una clusula CHANGE
old_col_name create_definition. Para hacerlo, hay que especificar los
nombres antiguo y nuevo de la columna y el tipo que la columna tiene
actualmente. Por ejemplo, para renombrar una columna INTEGER desde a
a b, se puede hacer esto:
mysql> ALTER TABLE t1 CHANGE a b INTEGER;

Si se quiere cambiar el tipo de una columna, pero no su nombre, la sintaxis


de CHANGE sigue necesitando un nombre de columna antiguo y nuevo,
aunque mantenga en mismo nombre. Por ejemplo:
mysql> ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;

Sin embargo, desde la versin 3.22.16a de MySQL, se puede usar


tambin MODIFY para modificar el tipo de una columna sin renombrarla:
mysql> ALTER TABLE t1 MODIFY b BIGINT NOT NULL;

Si se usa CHANGE o MODIFY para acortar una columna para la cual existe
un ndice en parte de la columna (por ejemplo, si se tiene un ndice en los

primeros 10 caracteres de una columna VARCHAR), no ser posible


acortar la columna a un nmero de caracteres menos que los indexados.
Cuando se cambia un tipo de columna usando CHANGE o MODIFY,
MySQL intenta convertir datos al nuevo tipo lo mejor posible.
En versiones 3.22 o siguientes de MySQL, se puede usar FIRST o ADD ...
AFTER col_name para aadir una columna en una posicin especfica
dentro de una fila de la tabla. Por defecto se aade la columna al final.
Desde MySQL 4.0.1, se pueden usar las palabras FIRST y AFTER en
unCHANGE o MODIFY.
ALTER COLUMN especifica un nuevo valor por defecto para una columna
o elimina el valor por defecto anterior. Si se elimina el anterior valor por
defecto y la columna puede ser NULL, el nuevo valor por defecto es NULL.
Si la columna no puede ser NULL, MySQL asigna un nuevo valor por
defecto, como se describe en .
DROP INDEX elimina un ndice. Esto es una extensin MySQL para SQL92. Ver la sintaxis de .

Si se quitan columnas de una tabla, tambin se eliminan de cualquier


ndice de las que formen parte. Si todas las columnas que forman parte de
un ndice se eliminan, el ndice se elimina tambin.

Si la tabla contiene slo una columna, sta no puede ser eliminada. Si lo


que se pretende es eliminar la tabla, se debe usar .

DROP PRIMARY KEY elimina el ndice primario. Si no existiera ese ndice,


se eliminar el primer ndice UNIQUE de la tabla. (MySQL marca la
primera clave UNIQUE como la PRIMARY KEY si no se ha especificado
una PRIMARY KEY explcitamente.) Si se aade una UNIQUE INDEX o
una PRIMARY KEY a la tabla, se almacena antes de cualquier
ndice UNIQUE de modo que MySQL pueda detectar claves duplicadas lo
ms pronto posible.
ORDER BY permite crear una nueva tabla con un orden especfico para las
filas. La tabla no permanecer en ese orden despus de nuevas inserciones
o borrados. En alginos casos, es ms fcil hacer que MySQL ordenar si la
tabla est indexada por la columna por la que se desea ordenarla ms
tarde. Esta opcin es corriente principalmente cuando se sabe que se va a
consultar la tabla principalmente en un orden determinado; usando esta
opcin despus de grandes campos en la tabla, es posible obtener un mejor
rendimiento.
Si se usa ALTER TABLE en una tabla MyISAM, todos los ndices no
nicos sern creados en un proceso separado (como en ). Esto haceALTER
TABLE mucho ms rpido cuando existe muchos ndices.
Desde MySQL 4.0 la caracterstica anterior puede ser activada
explcitamente. ALTER TABLE ... DISABLE KEYS hace que MySQL
detenga
la
actualizacin
de
ndices
no
nicos
para
tablas MyISAM. ALTER TABLE ... ENABLE KEYS debe ser usado
para recrear ndices perdidos. Como MySQL hace esto con un algoritmo
especial que es mucho ms rpido cuando se insertan claves una a una,
desactivar las claves puede proporcionar una considerable mejora de
tiempo cuando se inserta gran cantidad de filas.

Con la funcin del API de C mysql_info, se puede obtener ccuantos


registros han sido copiados, y (si se ha usado IGNORE) cuantos registros
fueron borrados por la duplicacin de valores de clave.
Las clasulas FOREIGN KEY, CHECK y REFERENCES actualmente no
hacen nada, excepto para tablas del tipo InnoDB que soportant ... ADD
[CONSTRAINT [symbol]] FOREIGN KEY (...) REFERENCES ... (...) y ...
DROP FOREIGN KEY .... Ver restricciones . La sintaxis para otros tipos de
tabla se proporciona slo por compatibilidad, para hacer ms fcil portar
cdigo desde otros servidores SQL y para ejecutar aplicaciones que crean
tablas con referencias.
ALTER TABLE ignora las opciones de tabla DATA DIRECTORY y INDEX
DIRECTORY.
Si se quieren cambiar todas las columnas CHAR/VARCHAR/TEXT a un
nuevo juego de caracteres (por ejemplo despus de actualizar desde
MySQL 4.0.x a 4.1.1) se puede hacer:
ALTER TABLE table_name CHARACTER SET character_set_name;

El comando siguiente slo cambia el juego de caracteres por defecto para la


tabla:
ALTER TABLE table_name DEFAULT CHARACTER SET
character_set_name;

El juego de caracteres por defecto es el que se usa si no se especifica un


juego de caracteres para una nueva columna que se aada a la tabla (por
ejemplo con ALTER TABLE ... ADD column).
Seguidamente se muestra un ejemplo que demuestra como usar ALTER TABLE.
Empezamos creando una tabla t1 como:

mysql> CREATE TABLE t1 (a INTEGER,b CHAR(10));

Para renombrar la tabla de t1 a t2:


mysql> ALTER TABLE t1 RENAME t2;

Para cambiar la columna a de INTEGER a TINYINT NOT NULL (dejando el mismo


nombre), y cambiar la columna b de CHAR(10) a CHAR(20) y adems renombrando
de b a c:
mysql> ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);

Para aadir una columna TIMESTAMP llamada d:


mysql> ALTER TABLE t2 ADD d TIMESTAMP;

Para aadir un ndice en la columna d, y hacer la columna a la clave primaria:


mysql> ALTER TABLE t2 ADD INDEX (d), ADD PRIMARY KEY (a);

Para eliminar la columna c:


mysql> ALTER TABLE t2 DROP COLUMN c;

Para aadir una nueva columna entera AUTO_INCREMENT llamada c:


mysql> ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT,
ADD INDEX (c);

Anotar que debemos indexar en c, porque las columnas AUTO_INCREMENT deben


estar indexadas, y tambin que hemos declarado c como NOT NULL, proque las
columnas indexadas no pueden ser NULL.
Cuandos e aade una columna AUTO_INCREMENT, los calores de columna se llenan
con una secuencia numrica automticamente. Se puede elegir el primer nmero de la
secuencia ejecutando antes de ALTER TABLE o usando la opcin de
tanbla AUTO_INCREMENT=value.
Con tablas MyISAM, si no se modifica la columna AUTO_INCREMENT, la secuencia
de numrica no resultar afectada. Si se elimina una columnaAUTO_INCREMENT y
despus se aade otra columna AUTO_INCREMENT, los nmeros empezarm en 1
otra vez.

Вам также может понравиться