ALTER [IGNORE] TABLEtbl_namealter_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_namecolumn_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_nameVARCHAR 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_nameDROP
            , y
            col_nameDROP 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_nametbl_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_definitionINTEGER 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_nameFIRST 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 TABLEyourtablenameDROP 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_nameCONVERT 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_nameDEFAULT 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
        valueALTER TABLE o usando la opción de tabla
        AUTO_INCREMENT=.
        Consulte Sección 13.5.3, “Sintaxis de valueSET”.
      
        Desde MySQL 5.0.3, puede usar la opción de tabla ALTER
        TABLE ...
        AUTO_INCREMENT= para
        valueInnoDB 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.

