ALTER [IGNORE] TABLEtbl_name
alter_specification
[,alter_specification
] ...alter_specification
: ADD [COLUMN]column_definition
[FIRST | AFTERcol_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 DEFAULTliteral
| DROP DEFAULT} | CHANGE [COLUMN]old_col_name
column_definition
[FIRST|AFTERcol_name
] | MODIFY [COLUMN]column_definition
[FIRST | AFTERcol_name
] | DROP [COLUMN]col_name
| DROP PRIMARY KEY | DROP INDEXindex_name
| DROP FOREIGN KEYfk_symbol
| DISABLE KEYS | ENABLE KEYS | RENAME [TO]new_tbl_name
| ORDER BYcol_name
| CONVERT TO CHARACTER SETcharset_name
[COLLATEcollation_name
] | [DEFAULT] CHARACTER SETcharset_name
[COLLATEcollation_name
] | DISCARD TABLESPACE | IMPORT TABLESPACE |table_options
ALTER TABLE
le permite cambiar la estructura
de una tabla existente. Por ejemplo, puede añadir 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 cláusulas del comando CREATE
TABLE
. Esto incluye modificaciones
table_options
, para opciones tales
como ENGINE
,
AUTO_INCREMENT
, y
AVG_ROW_LENGTH
. Consulte
Sección 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
operación. Estas advertencias pueden mostrarse con
SHOW WARNINGS
. Consulte
Sección 13.5.4.22, “Sintaxis de SHOW WARNINGS
”.
Si usa ALTER TABLE
para cambiar la
especificación de una columna pero DESCRIBE
indica que la
columna no ha cambiado, es posible que MySQL haya ignorado las
modificaciones por alguna de las razones descritas en
Sección 13.1.5.1, “Cambios tácitos en la especificación de columnas”. Por ejemplo, si intenta
cambiar una columna tbl_name
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 alteración 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 automáticamente a la nueva tabla sin
ninguna actualización fallida.
Tenga en cuenta que si usa cualquier otra opción 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
operación de recrear índices (que es la parte más lenta del
proceso de alteración) 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 extensión MySQL a SQL
estándar. Controla cómo 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, sólo se usa el primer registro. El resto de
registros conflicitivos se borran. Los valores erróneos se
truncan al valor más cercano aceptable.
Puede ejecutar múltiples cláusulas ADD
,
ALTER
, DROP
, y
CHANGE
en un único comando
ALTER TABLE
. Esta es una extensión
MySQL al estándar SQL, que permite sólo una de cada
cláusula por comando ALTER TABLE
. Por
ejemplo, para borrar múltiples columnas en un único
comando:
mysql> ALTER TABLE t2 DROP COLUMN c, DROP COLUMN d;
CHANGE
, col_name
DROP
, y
col_name
DROP INDEX
son extensiones MySQL al
estándar SQL.
MODIFY
es una extensión de Oracle a
ALTER TABLE
.
La palabra COLUMN
es opcional y puede
omitirse.
Si usa ALTER TABLE
sin
ninguna otra opción, MySQL símplemente renombra cualquier
fichero que se corresponda a la tabla
tbl_name
RENAME TO
new_tbl_name
tbl_name
. No es necesario crear
una tabla temporal. (Puede usar el comando RENAME
TABLE
para renombrar tablas. Consulte
Sección 13.1.9, “Sintaxis de RENAME TABLE
”.)
Las cláusulas 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 sólo el tipo. Consulte
Sección 13.1.5, “Sintaxis de CREATE TABLE
”.
Puede renombrar una columna usando CHANGE
. Para
ello, especifique el nombre de columna viejo y nuevo y el
tipo de la columna actual. Por ejemplo, para renombrar una
columna old_col_name
column_definition
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 automáticamente.
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
para añadir una columna a una posición específica sin un
registro de tabla. Por defecto se añade al final. Puede
usar col_name
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 Sección 13.1.5, “Sintaxis de CREATE TABLE
”.
DROP INDEX
borra un índice. Es una
extensión MySQL al estándar SQL. Consulte
Sección 13.1.7, “Sintaxis de DROP INDEX
”.
Si las columnas se borran de una tabla, las columnas también se borran de cualquier índice del que formaran parte. Si todas las columnas que crean un índice se borran, también se borra el índice.
Si una tabla contiene sólo 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
borraría 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 daría
lugar a un error.
Si añade UNIQUE INDEX
o PRIMARY
KEY
a una tabla, se almacena antes que cualquier
índice no único para que MySQL pueda detactar claves
duplicadas tan rápido como sea posible.
ORDER BY
le permite crear la nueva tabla
con los registros en un orden específico. Tenga en cuenta
que la tabla no queda en este orden tras las inserciones y
borrados. Esta opción es útil cuando sabe que normalmente
consultará los registros en el mismo orden; usando esta
opción tras grandes cambios en la tabla, puede ser capaz de
obtener un mejor rendimiento. En algunos casos, puede hacer
la ordenación más fácil 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 más rápido cuando tiene muchos
índices.
En MySQL 5.0, esta característica puede activarse
explícitamente 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 más rápido que insertar
claves una a una, así que deshabilitar claves antes de
realizar operaciones de inserción masivas debería dar una
mejora de velocidad. Usar ALTER TABLE ... DISABLE
KEYS
requiere del permiso INDEX
además de los permisos mencionados anteriormente.
Las cláusulas FOREIGN KEY
y
REFERENCES
son soportadas por el motor
InnoDB
, que implementa ADD
[CONSTRAINT [
. Consulte
Sección 15.6.4, “Restricciones (constraints) symbol
]] FOREIGN KEY
(...) REFERENCES ... (...)FOREIGN KEY
”. Para otros
motores de almacenamiento, las cláusulas se parsean pero se
ignoran. La cláusula CHECK
se parsea
pero se ignora por todos los motores de almacenamiento.
Consulte Sección 13.1.5, “Sintaxis de CREATE TABLE
”. La razón para
aceptar pero ignorar las cláusulas es para compatibilidad,
para hacer más fácil portar código de otros servidores
SQL, y para ejecutar aplicaciones que crean tablas con
referencias. Consulte
Sección 1.7.5, “Diferencias en MySQL del estándar SQL”.
En MySQL 5.0, InnoDB
soporta el uso de
ALTER TABLE
para borrar claves foranas:
ALTER TABLEyourtablename
DROP FOREIGN KEYfk_symbol
;
Para más información, consulte
Sección 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 TABLEtbl_name
CONVERT TO CHARACTER SETcharset_name
;
Atención: La operación
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 razón de que esto funcione es que no hay conversión
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
tendrán un conjunto de carácters y que siguientes
operaciones CONVERT TO
no se les
aplicarán.
Para sólo cambiar el conjunto de caracteres por defecto de una tabla, use este comando:
ALTER TABLEtbl_name
DEFAULT CHARACTER SETcharset_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 añada a la tabla
(por ejemplo, con ALTER TABLE ... ADD
column
).
Atención: En MySQL 5.0,
ALTER TABLE ... DEFAULT CHARACTER SET
y
ALTER TABLE ... CHARACTER SET
son
equivalentes y cambian sólo 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 asegúrese 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, cópielo en el
directorio de la base de datos, luego realice el comando:
ALTER TABLE tbl_name
IMPORT TABLESPACE;
Consulte Sección 15.6.6, “Usar un espacio de tablas para cada tabla”.
Con la función mysql_info()
de la API de
C, puede consultar el número de registros copiados, y
(cuando se usa IGNORE
) cuántos
registros se borraron debido a duplicación de valores de
claves única. Consulte Sección 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 añadir una nueva columna TIMESTAMP
llamada d
:
mysql> ALTER TABLE t2 ADD d TIMESTAMP;
Para añadir í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 añadir 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 también
que declaramos c
como NOT
NULL
, ya que las columnas de clave primara no pueden
ser NULL
.
Cuando añade una columna AUTO_INCREMENT
los
valores se rellenan con números secuenciales automáticamente.
Para tablas MyISAM
puede asignar el primer
número de secuencia ejecutando SET
INSERT_ID=
antes de
value
ALTER TABLE
o usando la opción de tabla
AUTO_INCREMENT=
.
Consulte Sección 13.5.3, “Sintaxis de value
SET
”.
Desde MySQL 5.0.3, puede usar la opción de tabla ALTER
TABLE ...
AUTO_INCREMENT=
para
value
InnoDB
para asignar el número de secuencia
de nuevos registros si el valor es mayor que el máximo valor en
la columna AUTO_INCREMENT
. Si el
valor es menor que el máximo actual en la columna, no se da
ningún mensaje de error y el valor de secuencia actual no se
cambia.
Con tablas MyISAM
, si no cambia la columna
AUTO_INCREMENT
, el número de secuencia no
se ve afectado. Si elimina una columna
AUTO_INCREMENT
y luego añade otra columna
AUTO_INCREMENT
los números se resecuencian
comenzando en 1.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.