Anda di halaman 1dari 6

13.1.2.

Sintaxis de ALTER TABLE


ALTER [IGNORE] TABLE tbl_name
alter_specification [, alter_specification] ... alter_specification:

ADD [COLUMN] column_definition [FIRST | AFTER col_name ] | ADD [COLUMN] (column_definition,...) | ADD INDEX [index_name] [index_type] (index_col_name,...) | ADD [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...) | ADD [CONSTRAINT [symbol]] UNIQUE [index_name] [index_type] (index_col_name,...) | ADD [FULLTEXT|SPATIAL] [index_name] (index_col_name,...) | ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...) [reference_definition] | ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT} | CHANGE [COLUMN] old_col_name column_definition [FIRST|AFTER col_name] | MODIFY [COLUMN] column_definition [FIRST | AFTER col_name] | DROP [COLUMN] col_name | DROP PRIMARY KEY | DROP INDEX index_name | DROP FOREIGN KEY fk_symbol | DISABLE KEYS | ENABLE KEYS | RENAME [TO] new_tbl_name | ORDER BY col_name | CONVERT TO CHARACTER SET charset_name [COLLATE collation_name] | [DEFAULT] CHARACTER SET charset_name [COLLATE collation_name] | DISCARD TABLESPACE | IMPORT TABLESPACE | table_options ALTER TABLE le permite cambiar la estructura de una tabla existente. Por ejemplo, puede

aadir o borrar columnas, crear o destruir ndices, cambiar el tipo de columnas existentes, o renombrar columnas o la misma tabla. Puede cambiar el comentario de la tabla y su tipo. La sintaxis para varias de las alteraciones permitidas es similar a clusulas del comando CREATE TABLE. Esto incluye modificaciones table_options , para opciones tales como ENGINE, AUTO_INCREMENT, y AVG_ROW_LENGTH. Consulte Seccin 13.1.5, Sintaxis de CREATE TABLE.

Algunas operaciones pueden producir advertencias si se intentan en una tabla para que el motor de almacenamiento no soporte la operacin. Estas advertencias pueden mostrarse con SHOW WARNINGS. Consulte Seccin 13.5.4.22, Sintaxis de SHOW WARNINGS. Si usa ALTER TABLE para cambiar la especificacin de una columna pero DESCRIBE tbl_name indica que la columna no ha cambiado, es posible que MySQL haya ignorado las modificaciones por alguna de las razones descritas en Seccin 13.1.5.1, Cambios tcitos en la especificacin de columnas. Por ejemplo, si intenta cambiar una columna VARCHAR a CHAR, MySQL usa VARCHAR si la tabla contiene otras columnas de longitud variable.
ALTER TABLE funciona creando una copia temporal de la tabla original. La alteracin se

realiza en la copia, luego la tabla original se borra y se renombra la nueva. Mientras se ejecuta ALTER TABLE la tabla original es legible por otros clientes. Las actualizaciones y escrituras en la tabla se esperan hasta que la nueva tabla est lista, luego se redirigen automticamente a la nueva tabla sin ninguna actualizacin fallida. Tenga en cuenta que si usa cualquier otra opcin en ALTER TABLE distinta a RENAME, MySQL siempre crea una tabla temporal, incluso si los datos no necesitan ser copiados (tales como cuando cambia el nombre de una columna). Planeamos arreglar esto en el futuro, pero debido a que ALTER TABLE no es un comando que se use frecuentemente, no es un tema demasiado urgente. Para tablas MyISAM puede incrementar la velocidad de la operacin de recrear ndices (que es la parte ms lenta del proceso de alteracin) mediante la variable de sistema myisam_sort_buffer_size poniendo un valor alto.

Para usar ALTER TABLE, necesita ALTER, INSERT, y permisos CREATE para la tabla. IGNORE es una extensin MySQL a SQL estndar. Controla cmo funciona ALTER TABLE si hay duplicados en las claves primarias en la nueva tabla o si ocuren advertencias cuando est activo el modo STRICT. Si no se especifica IGNORE la copia se aborta y no se ejecuta si hay errores de clave duplicada. Si se especifica IGNORE , entonces para duplicados con clave nica, slo se usa el primer registro. El resto de registros conflicitivos se borran. Los valores errneos se truncan al valor ms cercano aceptable. Puede ejecutar mltiples clusulas ADD, ALTER, DROP, y CHANGE en un nico comando ALTER TABLE . Esta es una extensin MySQL al estndar SQL, que permite slo una de cada clusula por comando ALTER TABLE . Por ejemplo, para borrar mltiples columnas en un nico comando:
mysql> ALTER TABLE t2 DROP COLUMN c, DROP COLUMN d; CHANGE col_name, DROP col_name, y DROP INDEX son extensiones MySQL al

estndar SQL. MODIFY es una extensin de Oracle a ALTER TABLE. La palabra COLUMN es opcional y puede omitirse. Si usa ALTER TABLE tbl_name RENAME TO new_tbl_name sin ninguna otra opcin, MySQL smplemente renombra cualquier fichero que se corresponda a la tabla tbl_name. No es necesario crear una tabla temporal. (Puede usar el comando RENAME TABLE para renombrar tablas. Consulte Seccin 13.1.9, Sintaxis de RENAME TABLE.) Las clusulas column_definition usan la misma sintaxis para ADD y CHANGE as como CREATE TABLE. Tenga en cuenta que esta sintaxis incluye el nombre de la columna, no slo el tipo. Consulte Seccin 13.1.5, Sintaxis de CREATE TABLE. Puede renombrar una columna usando CHANGE old_col_name column_definition. Para ello, especifique el nombre de columna viejo y nuevo y el tipo de la columna actual. Por ejemplo, para renombrar una columna INTEGER de a a b, puede hacer:
mysql> ALTER TABLE t1 CHANGE a b INTEGER;

Si quiere cambiar el tipo de una columna pero no el nombre, la sintaxis CHANGE necesita un nombre viejo y nuevo de columna, incluso si son iguales. Por ejemplo:
mysql> ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;

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

Si usa CHANGE o MODIFY para acortar una columna para la que existe un ndice en la columna, y la longitud de la columna resultante es menor que la del ndice, MySQL reduce el ndice automticamente. Cuando cambia un tipo de columna usando CHANGE o MODIFY, MySQL intenta convertir valores de columna existentes al nuevo tipo lo mejor posible. En MySQL 5.0, puede usar FIRST o AFTER col_name para aadir una columna a una posicin especfica sin un registro de tabla. Por defecto se aade al final. Puede usar FIRST y AFTER en operaciones CHANGE o MODIFY en MySQL 5.0. ALTER COLUMN especifica un nuevo valor por defecto para una columna o borra el antiguo valor por defecto. Si el antiguo valor por defecto se borra y la columna puede ser NULL, el nuevo valor por defecto es NULL. Si la columna no puede ser NULL, MySQL asigna un valor por defecto, como se describe en Seccin 13.1.5, Sintaxis de CREATE TABLE. DROP INDEX borra un ndice. Es una extensin MySQL al estndar SQL. Consulte Seccin 13.1.7, Sintaxis de DROP INDEX. Si las columnas se borran de una tabla, las columnas tambin se borran de cualquier ndice del que formaran parte. Si todas las columnas que crean un ndice se borran, tambin se borra el ndice. Si una tabla contiene slo una columna, la columna no puede borrarse. Si lo que quiere es borrar la tabla, use DROP TABLE . DROP PRIMARY KEY borra el ndice primario. Nota: En versiones anteriores de MySQL, si no existe clave primaria, entonces DROP PRIMARY KEY borrara el primer ndice UNIQUE de la tabla. Esto ya no es as en MySQL 5.0, cuando trata de usar DROP PRIMARY KEY en una tabla sin clave primaria dara lugar a un error. Si aade UNIQUE INDEX o PRIMARY KEY a una tabla, se almacena antes que cualquier ndice no nico para que MySQL pueda detactar claves duplicadas tan rpido como sea posible.

ORDER BY le permite crear la nueva tabla con los registros en un orden especfico.

Tenga en cuenta que la tabla no queda en este orden tras las inserciones y borrados. Esta opcin es til cuando sabe que normalmente consultar los registros en el mismo orden; usando esta opcin tras grandes cambios en la tabla, puede ser capaz de obtener un mejor rendimiento. En algunos casos, puede hacer la ordenacin ms fcil para MySQL si la tabla est en el orden de la columna por la que quiere ordenar posteriormente. Si usa ALTER TABLE en una tabla MyISAM , todos los ndices no nicos se crean en un batch separado (como para REPAIR TABLE). Esto debe hacer ALTER TABLE mucho ms rpido cuando tiene muchos ndices. En MySQL 5.0, esta caracterstica puede activarse explcitamente ALTER TABLE ... DISABLE KEYS le dice a MySQL que pare de actualizar ndices no nicos para una tabla MyISAM . ALTER TABLE ... ENABLE KEYS debe usarse para recrear ndices

perdidos. MySQL lo hace con un algoritmo especial que es mucho ms rpido que insertar claves una a una, as que deshabilitar claves antes de realizar operaciones de insercin masivas debera dar una mejora de velocidad. Usar ALTER TABLE ... DISABLE KEYS requiere del permiso INDEX adems de los permisos mencionados anteriormente.

Las clusulas FOREIGN KEY y REFERENCES son soportadas por el motor InnoDB, que implementa ADD [CONSTRAINT [symbol]] FOREIGN KEY (...) REFERENCES ... (...). Consulte Seccin 15.6.4, Restricciones (constraints) FOREIGN KEY. Para otros motores de almacenamiento, las clusulas se parsean pero se ignoran. La clusula CHECK se parsea pero se ignora por todos los motores de almacenamiento. Consulte Seccin 13.1.5, Sintaxis de CREATE TABLE. La razn para aceptar pero ignorar las clusulas es para compatibilidad, para hacer ms fcil portar cdigo de otros servidores SQL, y para ejecutar aplicaciones que crean tablas con referencias. Consulte Seccin 1.7.5, Diferencias en MySQL del estndar SQL. En MySQL 5.0, InnoDB soporta el uso de ALTER TABLE para borrar claves foranas:
ALTER TABLE yourtablename DROP FOREIGN KEY fk_symbol;

Para ms informacin, consulte Seccin 15.6.4, Restricciones (constraints) FOREIGN KEY.


ALTER TABLE ignora las opciones DATA DIRECTORY y INDEX DIRECTORY.

Si quiere cambiar el conjunto de caracteres por defecto de la tabla y todas las columnas de caracteres (CHAR, VARCHAR, TEXT) a un nuevo conjunto de caracteres, use un comando como:
ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;

Atencin: La operacin precedente convierte los valores de columnas entre conjuntos de caracteres. Esto no es lo que quiere hacer si tiene una columna en un conjunto de caracteres (como latin1) pero los valores almacenados realmente usan otro conjunto de caracteres incompatible (como utf8). En este caso, tiene que hacer lo siguiente para cada una de tales columnas:
ALTER TABLE t1 CHANGE c1 c1 BLOB; ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8;

La razn de que esto funcione es que no hay conversin cuando convierte desde o hacia columnas BLOB . Si especifica CONVERT TO CHARACTER SET binary, las columnas CHAR, VARCHAR, y TEXT se converten a sus cadenas de caracteres binarias (BINARY, VARBINARY, BLOB). Esto significa que las columnas no tendrn un conjunto de carcters y que siguientes operaciones CONVERT TO no se les aplicarn. Para slo cambiar el conjunto de caracteres por defecto de una tabla, use este comando:
ALTER TABLE tbl_name DEFAULT CHARACTER SET charset_name;

La palabra DEFAULT es opcional. El conjunto de caracteres por defecto es el que se usa si no especifica uno para una nueva columna que aada a la tabla (por ejemplo, con ALTER TABLE ... ADD column). Atencin: En MySQL 5.0, ALTER TABLE ... DEFAULT CHARACTER SET y ALTER TABLE ... CHARACTER SET son equivalentes y cambian slo el conjunto de caracteres por defecto de la tabla.

Para una tabla InnoDB creada con su propio espacio de tablas en un fichero .ibd, este fichero puede descartarse e importarse. Para descatar el fichero .ibd , use este comando:
ALTER TABLE tbl_name DISCARD TABLESPACE;

Esto borra el fichero .ibd actual, as que asegrese que tiene primero una copia de seguridad. Tratar de acceder a la tabla mientras se descarta el fichero provoca un error. Para importar el fichero .ibd de la copia de seguridad de nuevo a la tabla, cpielo en el directorio de la base de datos, luego realice el comando:
ALTER TABLE tbl_name IMPORT TABLESPACE;

Consulte Seccin 15.6.6, Usar un espacio de tablas para cada tabla.

Con la funcin mysql_info() de la API de C, puede consultar el nmero de registros copiados, y (cuando se usa IGNORE ) cuntos registros se borraron debido a duplicacin de valores de claves nica. Consulte Seccin 24.2.3.32, mysql_info().

Hay algunos ejemplos que muestran usos de ALTER TABLE. Comienza con una tabla t1 que se crea como se muestra:
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 desde INTEGER a TINYINT NOT NULL (dejando el mismo nombre), y para cambiar la columna b desde CHAR(10) a CHAR(20) as como dejarla de b a c:
mysql> ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);

Para aadir una nueva columna TIMESTAMP llamada d:


mysql> ALTER TABLE t2 ADD d TIMESTAMP;

Para aadir ndices en las columnas d y a:

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

Para borrar 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 PRIMARY KEY (c);

Tenga en cuenta que indexamos c (como PRIMARY KEY), ya que las columnas AUTO_INCREMENT deben indexarse, y tambin que declaramos c como NOT NULL, ya que las columnas de clave primara no pueden ser NULL. Cuando aade una columna AUTO_INCREMENT los valores se rellenan con nmeros secuenciales automticamente. Para tablas MyISAM puede asignar el primer nmero de secuencia ejecutando SET INSERT_ID=value antes de ALTER TABLE o usando la opcin de tabla AUTO_INCREMENT=value. Consulte Seccin 13.5.3, Sintaxis de SET. Desde MySQL 5.0.3, puede usar la opcin de tabla ALTER TABLE ... AUTO_INCREMENT=value para InnoDB para asignar el nmero de secuencia de nuevos registros si el valor es mayor que el mximo valor en la columna AUTO_INCREMENT . Si el valor es menor que el mximo actual en la columna, no se da ningn mensaje de error y el valor de secuencia actual no se cambia. Con tablas MyISAM , si no cambia la columna AUTO_INCREMENT , el nmero de secuencia no se ve afectado. Si elimina una columna AUTO_INCREMENT y luego aade otra columna AUTO_INCREMENT los nmeros se resecuencian comenzando en 1. Consulte Seccin A.7.1, Problemas con ALTER TABLE.

sta es una traduccin del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL est escrito en ingls, y esta traduccin no necesariamente est tan actualizada como la versin original. Para cualquier sugerencia sobre la traduccin y para sealar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.

Anda mungkin juga menyukai