Capítulo 13. Sintaxis de sentencias SQL

MySQL 5.0

Capítulo 13. Sintaxis de sentencias SQL

Tabla de contenidos

13.1. Sentencias de definición de datos (Data Definition Statements)
13.1.1. Sintaxis de
13.1.2. Sintaxis de
13.1.3. Sintaxis de
13.1.4. Sintaxis de
13.1.5. Sintaxis de
13.1.6. Sintaxis de
13.1.7. Sintaxis de
13.1.8. Sintaxis de
13.1.9. Sintaxis de
13.2. Sentencias de manipulación de datos (Data Manipulation Statements)
13.2.1. Sintaxis de
13.2.2. Sintaxis de
13.2.3. Sintaxis de
13.2.4. Sintaxis de
13.2.5. Sintaxis de
13.2.6. Sintaxis de
13.2.7. Sintaxis de
13.2.8. Sintaxis de subconsultas
13.2.9. Sintaxis de
13.2.10. Sintaxis de
13.3. Sentencias útiles de MySQL
13.3.1. Sintaxis de (Información acerca de las columnas)
13.3.2. Sintaxis de
13.4. Comandos transaccionales y de bloqueo de MySQL
13.4.1. Sintaxis de , y
13.4.2. Sentencias que no se pueden deshacer
13.4.3. Sentencias que causan una ejecución (commit) implícita
13.4.4. Sintaxis de y
13.4.5. Sintaxis de y
13.4.6. Sintaxis de
13.5. Sentencias de administración de base de datos
13.5.1. Sentencias para la gestión de cuentas
13.5.2. Sentencias para el mantenimiento de tablas
13.5.3. Sintaxis de
13.5.4. Sintaxis de
13.5.5. Otras sentencias para la administración
13.6. Sentencias de replicación
13.6.1. Sentencias SQL para el control de servidores maestros
13.6.2. Sentencias SQL para el control de servidores esclavos
13.7. Sintaxis SQL de sentencias preparadas

Este capítulo describe la sintaxis para los comandos SQL soportados en MySQL.

13.1. Sentencias de definición de datos (Data Definition Statements)

13.1.1. Sintaxis de ALTER DATABASE

ALTER {DATABASE | SCHEMA} []
     [, ] ...

:
    [DEFAULT] CHARACTER SET 
  | [DEFAULT] COLLATE 

le permite cambiar las características globales de una base de datos. Estas características se almacenan en el fichero en el directorio de la base de datos. Para usar , necesita el permiso en la base de datos.

La cláusula cambia el conjunto de carácteres por defecto de la base de datos. La cláusula cambia la colación por defecto de la base de datos. El conjunto de carácteres y la colación se discuten en Capítulo 10, Soporte de conjuntos de caracteres.

En MySQL 5.0, el nombre de base de datos puede omitirse. El comando se aplica a la base de datos por defecto. puede usarse desde MySQL 5.0.2.

13.1.2. Sintaxis de ALTER TABLE

ALTER [IGNORE] TABLE 
     [, ] ...

:
    ADD [COLUMN]  [FIRST | AFTER  ]
  | ADD [COLUMN] (,...)
  | ADD INDEX [] [] (,...)
  | ADD [CONSTRAINT []]
        PRIMARY KEY [] (,...)
  | ADD [CONSTRAINT []]
        UNIQUE [] [] (,...)
  | ADD [FULLTEXT|SPATIAL] [] (,...)
  | ADD [CONSTRAINT []]
        FOREIGN KEY [] (,...)
        []
  | ALTER [COLUMN]  {SET DEFAULT  | DROP DEFAULT}
  | CHANGE [COLUMN]  
        [FIRST|AFTER ]
  | MODIFY [COLUMN]  [FIRST | AFTER ]
  | DROP [COLUMN] 
  | DROP PRIMARY KEY
  | DROP INDEX 
  | DROP FOREIGN KEY 
  | DISABLE KEYS
  | ENABLE KEYS
  | RENAME [TO] 
  | ORDER BY 
  | CONVERT TO CHARACTER SET  [COLLATE ]
  | [DEFAULT] CHARACTER SET  [COLLATE ]
  | DISCARD TABLESPACE
  | IMPORT TABLESPACE
  | 

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 . Esto incluye modificaciones , para opciones tales como , , y . Consulte Sección 13.1.5, “Sintaxis de .

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 . Consulte Sección 13.5.4.22, “Sintaxis de .

Si usa para cambiar la especificación de una columan pero 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 a , MySQL usa si la tabla contiene otras columnas de longitud variable.

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 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 distinta a , 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 no es un comando que se use frecuentemente, no es un tema demasiado urgente. Para tablas 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 poniendo un valor alto.

  • Para usar , necesita , , y permisos para la tabla.

  • es una extensión MySQL a SQL estándar. Controla cómo funciona si hay duplicados en las claves primarias en la nueva tabla o si ocuren advertencias cuando está activo el modo . Si no se especifica la copia se aborta y no se ejecuta si hay errores de clave duplicada. Si se especifica , 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 , , , y en un único comando . Esta es una extensión MySQL al estándar SQL, que permite sólo una de cada cláusula por comando . Por ejemplo, para borrar múltiples columnas en un único comando:

    mysql> ALTER TABLE t2 DROP COLUMN c, DROP COLUMN d;
    
  • , , y son extensiones MySQL al estándar SQL.

  • es una extensión de Oracle a .

  • La palabra es opcional y puede omitirse.

  • Si usa RENAME TO sin ninguna otra opción, MySQL símplemente renombra cualquier fichero que se corresponda a la tabla . No es necesario crear una tabla temporal. (Puede usar el comando para renombrar tablas. Consulte Sección 13.1.9, “Sintaxis de .)

  • Las cláusulas usan la misma sintaxis para y así como . 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 .

  • Puede renombrar una columna usando . Para ello, especifique el nombre de columna viejo y nuevo y el tipo de la columna actual. Por ejemplo, para renombrar una columna de a , puede hacer:

    mysql> ALTER TABLE t1 CHANGE a b INTEGER;
    

    Si quiere cambiar el tipo de una columna pero no el nombre, la sintaxis 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 para cambiar el tipo de una columna sin renombrarla:

    mysql> ALTER TABLE t1 MODIFY b BIGINT NOT NULL;
    
  • Si usa o 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 o , MySQL intenta convertir valores de columna existentes al nuevo tipo lo mejor posible.

  • En MySQL 5.0, puede usar o 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 y en operaciones o en MySQL 5.0.

  • 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 , el nuevo valor por defecto es . Si la columna no puede ser , MySQL asigna un valor por defecto, como se describe en Sección 13.1.5, “Sintaxis de .

  • borra un índice. Es una extensión MySQL al estándar SQL. Consulte Sección 13.1.7, “Sintaxis de .

  • 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 .

  • borra el índice primario. Nota: En versiones anteriores de MySQL, si no existe clave primaria, entonces borraría el primer índice de la tabla. Esto ya no es así en MySQL 5.0, cuando trata de usar en una tabla sin clave primaria daría lugar a un error.

    Si añade o a una tabla, se almacena antes que cualquier índice no único para que MySQL pueda detactar claves duplicadas tan rápido como sea posible.

  • 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 en una tabla , todos los índices no únicos se crean en un batch separado (como para ). Esto debe hacer mucho más rápido cuando tiene muchos índices.

    En MySQL 5.0, esta característica puede activarse explícitamente le dice a MySQL que pare de actualizar índices no únicos para una tabla . 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 requiere del permiso además de los permisos mencionados anteriormente.

  • Las cláusulas y son soportadas por el motor , que implementa ]] FOREIGN KEY (...) REFERENCES ... (...). Consulte Sección 15.6.4, “Restricciones (constraints) . Para otros motores de almacenamiento, las cláusulas se parsean pero se ignoran. La cláusula se parsea pero se ignora por todos los motores de almacenamiento. Consulte Sección 13.1.5, “Sintaxis de . 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, soporta el uso de para borrar claves foranas:

    ALTER TABLE  DROP FOREIGN KEY ;
    

    Para más información, consulte Sección 15.6.4, “Restricciones (constraints) .

  • ignora las opciones y .

  • Si quiere cambiar el conjunto de carácteres por defecto de la tabla y todas las columnas de carácteres (, , ) a un nuevo conjunto de carácteres, use un comando como:

    ALTER TABLE  CONVERT TO CHARACTER SET ;
    

    Atención: La operación precedente convierte los valores de columnas entre conjuntos de carácteres. Esto no es lo que quiere hacer si tiene una columna en un conjunto de carácteres (como ) pero los valores almacenados realmente usan otro conjunto de carácteres incompatible (como ). 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 .

    Si especifica , las columnas , , y se converten a sus cadenas de carácteres binarias (, , ). Esto significa que las columnas no tendrán un conjunto de carácters y que siguientes operaciones no se les aplicarán.

    Para sólo cambiar el conjunto de carácteres por defecto de una tabla, use este comando:

    ALTER TABLE  DEFAULT CHARACTER SET ;
    

    La palabra es opcional. El conjunto de carácteres por defecto es el que se usa si no especifica uno para una nueva columna que añada a la tabla (por ejemplo, con ).

    Atención: En MySQL 5.0, y son equivalentes y cambian sólo el conjunto de carácteres por defecto de la tabla.

  • Para una tabla creada con su propio espacio de tablas en un fichero , este fichero puede descartarse e importarse. Para descatar el fichero , use este comando:

    ALTER TABLE  DISCARD TABLESPACE;
    

    Esto borra el fichero 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 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  IMPORT TABLESPACE;
    

    Consulte Sección 15.6.6, “Usar un espacio de tablas para cada tabla”.

  • Con la función de la API de C, puede consultar el número de registros copiados, y (cuando se usa ) cuántos registros se borraron debido a duplicación de valores de claves única. Consulte Sección 24.3.3.32, “.

Hay algunos ejemplos que muestran usos de . Comienza con una tabla que se crea como se muestra:

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

Para renombrar la tabla de a :

mysql> ALTER TABLE t1 RENAME t2;

Para cambiar la columna desde a (dejando el mismo nombre), y para cambiar la columna desde a así como dejarla de a :

mysql> ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);

Para añadir una nueva columna llamada :

mysql> ALTER TABLE t2 ADD d TIMESTAMP;

Para añadir índices en las columnas y :

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

Para borrar la columna :

mysql> ALTER TABLE t2 DROP COLUMN c;

Para añadir una nueva columna entera llamada :

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

Tenga en cuenta que indexamos (como ), ya que las columnas deben indexarse, y también que declaramos como , ya que las columnas de clave primara no pueden ser .

Cuando añade una columna los valores se rellenan con números secuenciales automáticamente. Para tablas puede asignar el primer número de secuencia ejecutando antes de o usando la opción de tabla . Consulte Sección 13.5.3, “Sintaxis de .

Desde MySQL 5.0.3, puede usar la opción de tabla para para asignar el número de secuencia de nuevos registros si el valor es mayor que el máximo valor en la columna . 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 , si no cambia la columna , el número de secuencia no se ve afectado. Si elimina una columna y luego añade otra columna los números se resecuencian comenzando en 1.

Consulte Sección A.7.1, “Problemas con .

13.1.3. Sintaxis de CREATE DATABASE

CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] 
    [ [, ] ...]

:
    [DEFAULT] CHARACTER SET 
  | [DEFAULT] COLLATE 

crea una base de datos con el nombre dado. Para usar , necesita el permiso en la base de datos.

Las reglas para nombres de bases de datos permitidos se dan en Sección 9.2, “Nombres de bases de datos, tablas, índices, columnas y alias”. Ocurre un error si la base de datos existe y no especifica .

En MySQL 5.0, las opciones pueden darse para especificar característica de la base de datos. Las características se almacenan en el fichero en el directorio de la base de datos. La cláusula especifica el conjunto de carácteres por defecto de la base de datos. La cláusula especifica la colación por defecto de la base de datos. Los nombres de colación y de conjunto de carácteres se discuten en Capítulo 10, Soporte de conjuntos de caracteres.

Las bases de datos en MySQL se implementan como directorios que contienen ficheros que se corresponden a tablas en la base de datos. Como no hay tablas en la base de datos cuando se crean inicialmente, el comando en MySQL 5.0 crea sólo un directorio bajo el directorio de datos de MySQL y el fichero file.

Si crea manualmente un directorio bajo el directorio de datos (por ejemplo, con mkdir), el servidor lo considera como un directorio de base de datos y muestra la salida de .

puede usarse desde MySQL 5.0.2.

También puede usar el programa mysqladmin para crear bases de datos. Consulte Sección 8.4, “Administrar un servidor MySQL con mysqladmin.

13.1.4. Sintaxis de CREATE INDEX

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX 
    [USING ]
    ON  (,...)

:
     [()] [ASC | DESC]

En MySQL 5.0, se mapea a un comando para crear índices. Consulte Sección 13.1.2, “Sintaxis de .

Normalmente, crea todos los índices en una tabla cuando se crea la propia tabla con . Consulte Sección 13.1.5, “Sintaxis de . le permite añadir índices a tablas existentes.

Una lista de columnas de la forma crea un índice de múltiples columnas. Los valores de índice se forman al concatenar los valores de las columnas dadas.

Para columnas y , los índices pueden crearse para que usen sólo parte de una columna, usando () para indexar un prefijo consistente en los primeros carácteres de cada valor de la columna. t pueden indexarse, pero se debe dar una longitud de prefijo.

El comando mostrado aquí crea un índice usando los primeros 10 carácteres de la columna :

CREATE INDEX part_of_name ON customer (name(10));

Como la mayoría de nombres usualmente difieren en los primeros 10 carácteres, este índice no debería ser mucho más lento que un índice creado con la columna entera. Además, usar columnas parcialmente para índices puede hacer un fichero índice mucho menor, que puede ahorrar mucho espacio de disco y además acelarar las operaciones .

Los prefijos pueden tener una longitud de hasta 255 bytes. Para tablas y en MySQL 5.0, pueden tener una longitud de hasta 1000 bytes . Tenga en cuenta que los límites de los prefijos se miden en bytes, mientras que la longitud de prefijo en comandos se interpreta como el número de carácteres. Tenga esto en cuenta cuando especifique una longitud de prefijo para una columna que use un conjunto de carácteres de múltiples bytes.

En MySQL 5.0:

  • Puede añadir un índice en una columna que puede tener valores sólo si está usando , , o .

  • Puede añadir un índice en una columna o sólo si está usando el tipo de tabla , , o .

Una especificación puede acabar con o . Estas palabras se permiten para extensiones futuras para especificar almacenamiento de índice ascendente o descendente. Actualmente se parsean pero se ignoran; los valores de índice siempre se almacenan en orden ascendente.

En MySQL 5.0, algunos motores le permiten especificar un tipo de índice cuando se crea un índice. La sintaxis para el especificador es . Los valores posibles soportados por distintos motores se muestran en la siguiente tabla. Donde se muestran múltiples tipos de índice , el primero es el tipo por defecto cuando no se especifica .

Motor de almacenamiento Tipos de índice permitidos
,

Ejemplo:

CREATE TABLE lookup (id INT) ENGINE = MEMORY;
CREATE INDEX id_index USING BTREE ON lookup (id);

puede usarse como sinónimo de para especificar un tipo de índice. Sin embargo, es la forma preferida. Además, el nombre de índice que precede el tipo de índice en la especificación de la sintaxis de índice no es opcional con . Esto es debido a que, en contra de , no es una palabra reservada y se interpreta como nombre de índice.

Si especifica un tipo de índice que no es legal para un motor de almacenamiento, pero hay otro tipo de índice disponible que puede usar el motor sin afectar los resultados de la consulta, el motor usa el tipo disponible.

Para más información sobre cómo MySQL usa índices, consulte Sección 7.4.5, “Cómo utiliza MySQL los índices”.

Índices en MySQL 5.0 puede indexar sólo columnas , , y , y sólo en tablas . Consulte Sección 12.7, “Funciones de búsqueda de texto completo (Full-Text)”.

Índices en MySQL 5.0 puede indexar sólo columnas espaciales, y sólo en tablas . Los tipo de columna espaciales se describen en Capítulo 18, Extensiones espaciales de MySQL.

13.1.5. Sintaxis de CREATE TABLE

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] 
    [(,...)]
    [] []

O:

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] 
    [(] LIKE  [)];

:
    
  | [CONSTRAINT []] PRIMARY KEY [] (,...)
  | KEY [] [] (,...)
  | INDEX [] [] (,...)
  | [CONSTRAINT []] UNIQUE [INDEX]
        [] [] (,...)
  | [FULLTEXT|SPATIAL] [INDEX] [] (,...)
  | [CONSTRAINT []] FOREIGN KEY
        [] (,...) []
  | CHECK ()

:
      [NOT NULL | NULL] [DEFAULT ]
        [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY]
        [COMMENT ''] []

:
    TINYINT[()] [UNSIGNED] [ZEROFILL]
  | SMALLINT[()] [UNSIGNED] [ZEROFILL]
  | MEDIUMINT[()] [UNSIGNED] [ZEROFILL]
  | INT[()] [UNSIGNED] [ZEROFILL]
  | INTEGER[()] [UNSIGNED] [ZEROFILL]
  | BIGINT[()] [UNSIGNED] [ZEROFILL]
  | REAL[(,)] [UNSIGNED] [ZEROFILL]
  | DOUBLE[(,)] [UNSIGNED] [ZEROFILL]
  | FLOAT[(,)] [UNSIGNED] [ZEROFILL]
  | DECIMAL(,) [UNSIGNED] [ZEROFILL]
  | NUMERIC(,) [UNSIGNED] [ZEROFILL]
  | DATE
  | TIME
  | TIMESTAMP
  | DATETIME
  | CHAR() [BINARY | ASCII | UNICODE]
  | VARCHAR() [BINARY]
  | TINYBLOB
  | BLOB
  | MEDIUMBLOB
  | LONGBLOB
  | TINYTEXT [BINARY]
  | TEXT [BINARY]
  | MEDIUMTEXT [BINARY]
  | LONGTEXT [BINARY]
  | ENUM(,,,...)
  | SET(,,,...)
  | 

:
     [()] [ASC | DESC]

:
    REFERENCES  [(,...)]
               [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]
               [ON DELETE ]
               [ON UPDATE ]

:
    RESTRICT | CASCADE | SET NULL | NO ACTION

:  [] ...

:
    {ENGINE|TYPE} = 
  | AUTO_INCREMENT = 
  | AVG_ROW_LENGTH = 
  | [DEFAULT] CHARACTER SET  [COLLATE ]
  | CHECKSUM = {0 | 1}
  | COMMENT = ''
  | MAX_ROWS = 
  | MIN_ROWS = 
  | PACK_KEYS = {0 | 1 | DEFAULT}
  | PASSWORD = ''
  | DELAY_KEY_WRITE = {0 | 1}
  | ROW_FORMAT = {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
  | RAID_TYPE = { 1 | STRIPED | RAID0 }
        RAID_CHUNKS = 
        RAID_CHUNKSIZE = 
  | UNION = ([,]...)
  | INSERT_METHOD = { NO | FIRST | LAST }
  | DATA DIRECTORY = ''
  | INDEX DIRECTORY = ''


    [IGNORE | REPLACE] [AS] SELECT ...   ()

crea una tabla con el nombre dado. Debe tener el permiso para la tabla.

Las reglas para nombres de tabla permitidos se dan en Sección 9.2, “Nombres de bases de datos, tablas, índices, columnas y alias”. Por defecto, la tabla se crea en la base de datos actual. Ocurre un error si la tabla existe, si no hay base de datos actual o si la base de datos no existe.

En MySQL 5.0, el nombre de tabla puede especificarse como para crear la tabla en la base de datos específica. Esto funciona haya una base de datos actual o no. Si usa identificadores entre comillas, entrecomille el nombre de base de datos y de tabla por separado. Por ejemplo, es legal, pero no.

Puede usar la palabra al crear una tabla. Una tabla es visible sólo para la conexión actual, y se borra automáticamente cuando la conexión se cierra. Esto significa que dos conexiones distintas pueden usar el mismo nombre de tabla temporal sin entrar en conflicto entre ellas ni con tablas no con el mismo nombre. (La tabla existente se oculta hasta que se borra la tabla temporal.) En MySQL 5.0, debe tener el permiso para crear tablas temporales.

MySQL 5.0 soporta las palabras para que no ocurra un error si la tabla existe. Tenga en cuenta que no hay verificación que la tabla existente tenga una estructura idéntica a la indicada por el comando . Nota: Si usa en un comando ,cualquier registro seleccionado por la parte se inserta si la tabla existe o no.

MySQL representa cada tabla mediante un fichero de formato de tabla (definición) en el directorio de base de datos. El motor para la tabla puede crear otros ficheros también. En el caso de tablas , el motor crea ficheros índice y de datos. Por lo tanto, para cada tabla , hay tres ficheros de disco:

Fichero Propósito
.frm Fichero de formato de tabla (definición)
.MYD Fichero de datos
.MYI Fichero índice

Los ficheros creados por cada motor de almacenamiento para representar tablas se describen en Capítulo 14, Motores de almacenamiento de MySQL y tipos de tablas.

Para información general de las propiedades de los diversos tipos de columna, consulte Capítulo 11, Tipos de columna. Para información acerca de tipos de columna espaciales, consulte Capítulo 18, Extensiones espaciales de MySQL.

  • Si no se especifica ni , la columna se trata como si se especificara .

  • Una columna entera puede tener el atributo adicional . Cuando inserta un valor de (recomendado) o en una columna autoindexada, la columna se asigna al siguiente valor de secuencia. Típicamente esto es +1, donde es el mayor valor posible para la columna en la tabla. Secuencias comienzan con . Tales columnas deben definirse como uno de los tipos enteros como se describe en Sección 11.1.1, “Panorámica de tipos numéricos”. (El valor 1.0 no es un entero.) Consulte Sección 24.3.3.34, “.

    En MySQL 5.0, especificar para la opción de servidor o la variable de sistema le permite almacenar en columnas como sin generar un nuevo valor de secuencia. Consulte Sección 5.3.1, “Opciones del comando mysqld.

    Nota: Sólo puede haber una columna por tabla, debe estar indexada, y no puede tener un valor . Una columna funciona correctamente sólo si contiene sólo valores positivos. Insertar un número negativo se trata como insertar un número positivo muy grande. Esto se hace para evitar problemas de precisión cuando los números “cambian” de positivos a negativos y asegura que no obtiene accidentalmente una columna que contenga .

    Para tablas y , puede especificar una columna secundaria en una clave de múltiples columnas. Consulte Sección 3.6.9, “Utilización de .

    Para hacer MySQL compatible con otras aplicaciones ODBC , puede encontrar el valor para el último registro insertado con la siguiente consulta:

    SELECT * FROM  WHERE  IS NULL
    
  • En MySQL 5.0, las definiciones de columnas de carácteres puede incluir un atributo para especificar el conjunto de carácteres y, opcionalmente, una colación para la columna. Para detalles, consulte Capítulo 10, Soporte de conjuntos de caracteres. es sinónimo de .

    CREATE TABLE t (c CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin);
    

    MySQL 5.0 interpreta las especificaciones de longitud en definiciones de columna en carácteres. (Algunas versiones anteriores los interpretan en bytes.)

  • La cláusula especifica el valor por defecto para una columna. Con una excepción, el valor por defecto debe ser constante; no puede ser una función o una expresión. Esto significa , por ejemplo, que no puede poner como valor por defecto de una columna el valor de una función como o . La excepción es que pude especificar como defecto para columnas . Consulte Sección 11.3.1.1, “Propiedades de desde MySQL 4.1”.

    Antes de MySQL 5.0.2, si una definición de columna no incluye valor explícito, MySQL determina el valor por defecto como sigue:

    Si la columna puede tener valores , la columna se define como una cláusula explícita.

    Si la columna no puede tener valores , MySQL define la columna con una cláusula explícita, usando el valor por defecto implícito para el tipo de datos de la columna . Los valores por defecto implícitos se definen como sigue:

    • Para tipos numéricos distintos a los declarados con el atributo , por defecto es . Para una columna , el valor por defecto es el siguiente valor de la secuencia.

    • Para tipos de fecha y hora distintos a , el valor por defecto es el valor “cero” apropiado para el tipo. Para la primera columna en una tabla, el valor por defecto es la fecha actual y la hora. Consulte Sección 11.3, “Tipos de fecha y hora”.

    • Para tipos de cadenas distintos a , el valor por defecto es la cadena vacía. Para , el valor por defecto es el primer valor de la enumeración.

    Las columnas y no pueden tener un valor por defecto.

    Desde MySQL 5.0.2, si una definición de columna no incluye valor explícito , MySQL determina el valor por defecto como sigue:

    Si la columna puede tener como valor, la columna se define con una cláusula explícita. Esto es lo mismo que antes de 5.0.2.

    Si la columna no puede tener valores , MySQL define la columna sin cláusula explícita. Para entradas de datos, si un comando o no incluye valor para la columna, MySQL trata la columna según el modo SQL activo en ese momento:

    • Si el modo estricto no está activado, MySQL pone en la columna el valor por defecto implícito para el tipo de datos de la columna.

    • Si está activo el modo estricto, ocurre un error para tablas transaccionales y el comando se deshace. Para tablas no transaccionales, ocurre un error, pero si esto ocurre para el segundo registro o siguientes de un comando de múltiples registros, los registros precedentes se insertarán.

    Suponga que una tabla se define como sigue:

    CREATE TABLE t (i INT NOT NULL);
    

    En este caso, no tiene valor explícito, así que en modo estricto todos los siguientes comandos producen un error en modo estricto y no se inserta ningún registro. Para modo no estricto, sólo el tercer comando produce un error; el valor implícito por defecto se inserta para las dos primeras, pero la tercera falla ya que no puede producir un valor:

    INSERT INTO t VALUES();
    INSERT INTO t VALUES(DEFAULT);
    INSERT INTO t VALUES(DEFAULT(i));
    

    Consulte Sección 5.3.2, “El modo SQL del servidor”.

    Para una tabla dada, puede usar el comando para ver qué columnas puede tener una cláusula explícita .

  • Un comentario para una columna puede especificarse en MySQL 5.0 con la opción . El comentario se muestra con los comandos y .

  • En MySQL 5.0, el atributo puede usarse como un alias para .

  • normalemente es sinónimo para . En MySQL 5.0, el atributo clave puede especificarse como cuando se da en una definición de columna. Esto se implementó por compatibilidad con otros sistemas de bases de datos.

  • En MySQL, un índice es uno en que todos los valores en el índice deben ser distintos. Ocurre un error si intenta añadir un nuevo registro con una clave que coincida con un registro existente. La excepción es que una columna en el índice puede contener valores , puede contener valores múltiples. Esta excepción no se aplica a tablas , en las que una columna indexada le permita un único .

  • Una es una única donde todas las columnas de la clave deben definirse como . Si no se declaran explícitamente como , MySQL las declara implícitamente ( y sin decirlo ) . Una tabla puede tener sólo una . Si no tiene una y una aplicación pide una en sus tablas, MySQL retorna el primer índice que no tenga columnas como la .

  • En la tabla creada, una se guarda en primer lugar, seguida por todos los índices , y luego los índices no únicos. Esto ayuda al optimizador MySQL a priorizar qué indice usar y también detectar más rápido claves duplicadas.

  • Una puede ser un índice de múltiples columnas. Sin embargo, no puede crear un índice de múltiples columnas usando el atributo de clave en una especificación de columna. Hacerlo sólo marca la columna como primaria. Debe usar una cláusula separada.

  • Si un índice o consite sólo de una columna que tenga un tipo entero, puede referirse a la columna como en comandos .

  • En MySQL, el nombre de una es . Para otros índices, si no asigna un nombre, el índice tieen el mismo nombre que la primera columna indexada, con un sufijo opcional (, , ) para hacerlo único. Puede ver los nombres de índice para una tabla usando . Consulte Sección 13.5.4.11, “Sintaxis de .

  • A partir de MySQL 5.0, algunos motores de almacenamiento le permiten especificar un tipo de índice al crear el índice. Consulte Sección 13.1.4, “Sintaxis de .

    Para más información acerca de cómo usa los índices MySQL, consulte Sección 7.4.5, “Cómo utiliza MySQL los índices”.

  • En MySQL 5.0, sólo los motores , , , y soporta índices en columnas que pueden tener valores . En otros casos, debe declarar columnas indexadas como u ocurre un error.

  • Con sintaxis () en una especificación de índice, puede crear un índice que use sólo los primeros carácteres de una columna o . Indexar sólo un prefijo de valores de columna como este puede hacer el fichero de índice mucho más pequeño. Consulte Sección 7.4.3, “Índices de columna”.

    En MySQL 5.0, los motores y soportan indexación en columnas y . Al indexar columnas o debe especificar una longitud de prefijo para el índice. Por ejemplo:

    CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
    

    En MySQL 5.0, los prefijos pueden tener hasta 1000 bytes de longitud para tablas y y 255 bytes para otros tipos de tabla. Tenga en cuenta que los límites de prefijo se miden en bytes, mientras que la longitud de prefijo en comandos se interpretan como el número de carácteres. Asegúrese de tener esto en cuenta al especificar una longitud de prefijo para una columna que use un conjunto de carácteres multi-byte .

  • Una especificación puede acabar con o . Estas palabras clave se permiten para extensiones futuras para especificar almacenamiento de índices ascendente o descendentemente. Actualmente se parsean pero se ignoran; los valores de índice siempre se almacenan en orden ascendente.

  • Cuando usa o en una columna o en un , el servidor ordena los valores usando sólo el número inicial de bytes indicados por la variable de sistema . Consulte Sección 11.4.3, “Los tipos y .

  • En MySQL 5.0, puede crear índices especiales , que se usan para índices full-text . Sólo las tablas soportan índices . Pueden crearse sólo desde columnas , , y . La indexación siempre se hace sobre la columna entera; la indexación parcial no se soporta y cualquier longitud de prefijo se ignora. Consulte Sección 12.7, “Funciones de búsqueda de texto completo (Full-Text)” para más detalles.

  • En MySQL 5.0, puede crear índices en tipos de columna espaciales. Los tipos espaciales se soportan sólo para tablas y las columnas indexadas deben declararase como . Consulte Capítulo 18, Extensiones espaciales de MySQL.

  • En MySQL 5.0, las tablas soportan el chequeo de restricciones de claves foráneas . Consulte Capítulo 15, El motor de almacenamiento . Tenga en cuenta que la sintaxis en es más restrictiva que la sintaxis presentada para el comando al inicio de esta sección: las columnas en la tabla referenciada debe siempre nombrarse explícitamente. soporta tanto acciones como en MySQL 5.0. Para la sintaxis precisa, consulte Sección 15.6.4, “Restricciones (constraints) .

    Para otros motores de almacenamiento, MySQL Server parsea la sintaxis y en comandos , pero no hace nada. La cláusula se parsea paro se ignora en todos los motores de almacenamiento. Consulte Sección 1.7.5.5, “Claves foráneas (foreign keys)”.

  • Para tablas cada columna ocupa un bit extra, redondeado al byte más próximo. La máxima longitud de registro en bytes puede calcularse como sigue:

    row length = 1
                 + ()
                 + ( +  + 7)/8
                 + ()
    

    es 1 para tables con formato de registro estático. Las tablas estáticas usan un bit en el registro para un flag que indica si el registro se ha borrado. es 0 para tablas dinámicas ya que el flag se almacena en una cabecera de registro dinámica.

    Estos cálculos no se aplican en tablas , en las que el tamaño de almacenamiento no es distinto para columnas y .

La parte de la sintaxis puede usarse desde MySQL 3.23.

Las opciones y especifican el motor de almacenamiento para la tabla. es el nombre preferido para la opción en MySQL 5.0, y está obsoleto. El soporte para la palabra usada en este contexto desaparecerá en MySQL 5.1.

Las opciones y pueden tener los siguientes valores:

Motor de almacenamiento Descripción
El motor de almacenamiento para archivar. Consulte Sección 14.7, “El motor de almacenamiento .
Tablas transaccionales con bloqueo de página. Conocidas como . Consulte Sección 14.4, “El motor de almacenamiento ()”.
Tablas que almacenan registros en valores separados por comas. Consulte Sección 14.8, “El motor de almacenamiento .
Motor de ejemplo. Consulte Sección 14.5, “El motor de almacenamiento .
Motor que accede a tablas remotas. Consulte Sección 14.6, “El motor de almacenamiento .
Consulte Sección 14.3, “El motor de almacenamiento ()”.
(OBSOLETE) No disponible en MySQL 5.0. Si está actualizando a MySQL 5.0 desde una versión prévia, debe convertir cualquier tabla existente a antes de la actualización. Consulte Capítulo 14, Motores de almacenamiento de MySQL y tipos de tablas.
Tablas transaccionales con bloqueo de registro y claves foráneas. Consulte Capítulo 15, El motor de almacenamiento .
Los datos de este tipo de tabla se almacenan sólo en memoria. (Conocido anteriormente como .)
Colección de tablas usadas como una sola tabla. También conocido como . Consulte Sección 14.2, “El motor de almacenamiento .
Motor binario portable que es el motor por defecto usado en MySQL. Consulte Sección 14.1, “El motor de almacenamiento .
Clusterizado, tolerante a errores, tablas en memoria. También conocido como . Consulte Capítulo 16, MySQL Cluster.

Para más información acerca de motores MySQL, consulte Capítulo 14, Motores de almacenamiento de MySQL y tipos de tablas.

Si un motor no está disponible, MySQL usa en su lugar . Por ejemplo, si una definición de tabla incluye la opción pero el servidor MySQL no soporta tablas , la tabla se crea como . Esto hace posible tener un entorno de replicación donde tiene tablas transaccionales en el maestro pero tablas no transaccionales en el esclavo (para tener más velocidad). En MySQL 5.0, aparece una advertencia si la especificación del motor no es correcta.

Las otras opciones de tabla se usan para optimizar el comportamiento de la tabla. En la mayoría de casos, no tiene que especificar ninguna de ellas. La opción funciona para todos los motores a no ser que se indique lo contrario:

  • El valor inicial para para la tabla. En MySQL 5.0, sólo funciona para tablas y . También se soporta para desde MySQL 5.0.3. Para inicializar el primer valor de auto incremento para motores que no soporten esta opción, inserte un registro de prueba con un valor que sea uno menor al deseado tras crear la tabla, y luego borre este registro.

    Para motores que soportan la opción de tabla en comandos puede usar AUTO_INCREMENT = para resetear el valor .

  • Una aproximación de la longitud media de registro para su tabla. Necesita inicializarla sólo para tablas grandes con registros de longitud variable.

    Cuando crea una tabla , MySQL usa el producto de las opciones y para decidir el tamaño de la tabla resultante. Si no las especifica, el tamaño máximo para la tabla es 65,536TB de datos (4GB antes de MySQL 5.0.6). (Si su sistema operativo no soporta ficheros de este tamaño, los tamaños de fichero se restringen al límite del sistema operativo.) Si quiere mantener bajos los tamaños de los punteros para que el índice sea pequeño y rápido y no necesita realmente ficheros grandes, puede decrementar el tamaño de puntero por defecto mediante la variable de sistema que se añadió en MySQL 4.1.2. (Consulte Sección 5.3.3, “Variables de sistema del servidor”.) Si quiere que todas sus tablas sean capaces de crecer por encima del límite por defecto y quiere mantener sus tablas ligeramente más lentas y más grandes de lo necesario, puede incrementar el tamaño de punter por defecto cambiando esta variable.

  • Especifica el conjunto de carácteres para la tabla. es un sinónimo.

    para .

  • Especifica la colación por defecto de la tabla.

  • Póngalo a 1 si quiere que MySQL mantenga un checksum para todos los registros (un checksum que MySQL actualiza automáticamente según cambia la tabla). Esto hace que la tabla tenga actualizaciones más lentas, pero hace más fácil encontrar tablas corruptas. El comando muestra el checksum (sólo para ).

  • Un comentario para su tabla, hasta 60 carácteres.

  • Máximo número de registros que planea almacenar en la tabla. No es un límite absoluto, sino un indicador que la tabla debe ser capaz de almacenar al menos estos registros.

  • Mínimo número de registros que planea almacenar en la tabla.

  • Ponga esta opción a 1 si quiere tener índices más pequeños. Esto hace normalmente que las actualizaciones sean más lentas y las lecturas más rápidas. Poner esta opción a 0 deshabilita la compresión de claves. Ponerla a le dice al motor que comprima sólo columnas / largas ( y sólo).

    Si no usa , por defecto se comprimen sólo cadenas, no números. Si usa , también se empaquetan números.

    Al comprimir claves de números binarios, MySQL usa compresión de prefijo:

    • Cada clave necesita un byte extra para indicar cuántos bytes de la clave previa son los mismos para la siguiente clave.

    • El puntero al registro se almacena en orden de el-mayor-byte-primero directamente tras la clave, para mejorar la compresión.

    Esto significa que si tiene muchas claves iguales en dos registros consecutivos, todas las “mismas” claves siguientes usualmente sólo ocupan dos bytes (incluyendo el puntero al registro). Comparar esto con el caso ordinario donde las siguente claves ocupan (donde el tamaño del puntero es usualmente 4). Obtiene un gran beneficio a partir de la compresión de prefijos sñolo si tiene muchos números que sean el mismo. Si todas las claves son totalmente distintas, usa un byte más por clave, si la clave no es una clave que pueda tener valores . (En ese caso, el tamaño empaquetado de la clave se almacena en el mismo byte que se usa para marcar si una clave es .)

  • Encripta el fichero con una contraseña. Esta opción no hace nada en la versión estándar de MySQL.

  • Póngalo a 1 si quiere retardar actualizaciones de clave para la tabla hasta que la tabla se cierra (sólo en ).

  • Define cómo deben almacenarse los registros. Actualmente esta opción sólo funciona con tablas . El valor de la opción puede ser o para formato de longitud estática o variable. myisampack cambia el tipo a . Consulte Sección 14.1.3, “Formatos de almacenamiento de tablas .

    Desde MySQL/InnoDB-5.0.3, los registros de InnoDB se almacenan de forma más compacta () por defecto. El antiguo formato puede usarse espeficicando .

  • Tenga en cuenta que el soporte para se ha eliminado desde MySQL 5.0. Para información sobre , consulte Manual de referencia de MySQL 4.1.

  • se usa cuando quiere usar una colección de tablas idénticas como una. Funciona sólo con tablas . Consulte Sección 14.2, “El motor de almacenamiento .

    En MySQL 5.0, debe tener permisos , , y para las tablas mapeadas en una tabla . (Nota: Originalmente, todas las tablas usadas tenían que estar en la misma base de datos que la tabla . Esta restricción se ha eliminado.)

  • Si quiere insertar datos en una tabla debe especificarlo con en la tabla en que se debe insertar el registro. es una opción útil para tablas sólo. Use un valor dee o para que las inserciones vayan a la primera o última tabla, o un valor de para evitar inserciones. Consulte Sección 14.2, “El motor de almacenamiento .

  • ,

    Usando ' o ' puede especificar dónde debe el moto buardar un fichero de datos e índice de una tabla. Tenga en cuenta que el directorio debe ser una ruta completa al directorio (no una ruta relativa).

    Estas opciones sólo funcionan cuando no usa la opción . Su sistema operativo debe tener una llamada que funcione bien. Consulte Sección 7.6.1.2, “Utilización de enlaces simbólicos para tablas en Unix” para más información.

En MySQL 5.0, puede crear una tabla de otra añadiendo un comando al final del comando :

CREATE TABLE  SELECT * FROM ;

MySQL crea nuevas columnas para todos los elementos en un . Por ejemplo:

mysql> CREATE TABLE test (a INT NOT NULL AUTO_INCREMENT,
    ->        PRIMARY KEY (a), KEY(b))
    ->        TYPE=MyISAM SELECT b,c FROM test2;

Esto crea una tabla con tres columnas, , , y . Tenga en cuenta que las columnas para el comando se añaden a la derecha de la tabla, no se sobreescriben en la misma. Consulte el siguiente ejemplo:

mysql> SELECT * FROM foo;
+---+
| n |
+---+
| 1 |
+---+

mysql> CREATE TABLE bar (m INT) SELECT n FROM foo;
Query OK, 1 row affected (0.02 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM bar;
+------+---+
| m    | n |
+------+---+
| NULL | 1 |
+------+---+
1 row in set (0.00 sec)

Para cada registro en la tabla , se inserta un registro en con los valores de y valores por defecto para las nuevas columnas:

Si hay cualquier error al copiar los datos a la tabla, se borra automáticamente y no se crea.

no crea ningún índice automáticamente. Se hace a propósito para hacer el comando lo más flexible posible. Si quiere tener índices en la tabla creada, debe especificarlo antes del comando :

mysql> CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo;

Algunas conversiones de tipos de columnas pueden ocurrir. Por ejemplo, el atributo no se preserva, y las columnas pueden ser .

Al crear una tabla con , asegurése de poner un alias para cualquier llamada a función o expresión en la consulta. Si no lo hace, el comando puede fallar o crear nombres de columnas no deseados.

CREATE TABLE artists_and_works
SELECT artist.name, COUNT(work.artist_id) AS number_of_works
FROM artist LEFT JOIN work ON artist.id = work.artist_id
GROUP BY artist.id;

Puede especificar explícitamente el tipo de una columna generada:

CREATE TABLE foo (a TINYINT NOT NULL) SELECT b+1 AS a FROM bar;

En MySQL 5.0, use para crear una tabla vacía basada en la definición de otra tabla, incluyendo cualquier atributo de columna e índice definido en la tabla original:

CREATE TABLE  LIKE ;

no copia ninguna opción de tabla o especificadas en la tabla original, ni ninguna definición de clave foránea.

Puede preceder con o para indicar cómo tratar registros que dupliquen claves únicas. Con , los nuevos registros que duplican un registro único existente se descartan. Con , los nuevos registros reemplazan a los antiguos con el mismo valor. Si ni ni se indican, los valores únicos duplicados dan un error.

Para asegurar que el log de update o binario puede usarse para recrear tablas originales, MySQL no permite inserciones concurrentes durante .

13.1.5.1. Cambios tácitos en la especificación de columnas

En algunos casos, MySQL cambia especificaciones de columnas silencioasmente de las dadas en un comando o . Pueden ser cambiso a un tipo de datos, a atributos asociados con un tipo de datos o a una especificación de índice.

Los posibles cambios de tipos de datos se dan en la siguiente lista. Ocurren antes de MySQL 5.0.3. Desde 5.0.3, ocurre un error si no se puede crear una columna usando el tipo de datos especificado.

  • Columnas con una longitudo menor que cuatro se cambian a .

  • Si cualquier columna en una tabla tiene una longitud variable, el registro entero pasa a tener longitud variable. Por lo tanto, si una tabla contiene cualquier columna de longitud variable (, , o ), toda columna con más de tres carácteres se cambia a columna . Esto no afecta cómo usa las columnas en ningún modo; en MySQL, es sólo un modo distinto de almacenar carácteres. MySQL realiza esta conversión porque ahorra espacio y hacer las operaciones de tabla más rápidas. Consulte Capítulo 14, Motores de almacenamiento de MySQL y tipos de tablas.

  • Antes de MySQL 5.0.3, una columna o con una longitud mayor a 255 se convierte al tipo más pequeño que puede contener valores de la longitud dada. Por ejemplo, se convierte en , y se convierte en . Tenga en cuenta que esta conversión resulta en un cambio de comportamiento del tratamiento de espacios finales.

    Conversiones similares ocurren para y , excepto que se convierten en tipo .

    Desde MySQL 5.0.3, una columna o con una longitud mayor a 255 no se convierte silenciosamente . En su lugar, ocurre un error. Desde MySQL 5.0.6 , la conversión silenciosa de columnas y con una longitudo mayor a 65,535 no ocurre si el modo estricto SQL está activado. En su lugar, ocurre un error.

  • Para una especificación de ,), si no es mayor que , se ajusta por encima. Por ejemplo pasa a ser .

Otros cambios de columna incluyen cambios de atributos o especficación de índice:

  • Los tamaños de muestra de se descartan. Tenga en cuenta que columnas han cambiado considrablemente en versiones recientes de MySQL anteriores a 5.0; para una descripción, consulte Manual de referencia de MySQL 4.1.

  • Las columnas que son parte de son incluso si no se declaran como tales.

  • Los espacios finales se borran automáticamente para y cuando se crea la tabla.

  • MySQL mapea ciertos tipos de columna usados por otras bases de datos SQL a tipos MySQL . Consulte Sección 11.7, “Usar tipos de columnas de otros motores de bases de datos”.

  • Si incluye una cláusula para especificar un tipo de índice que no sea legal para un motor de almacenamiento dado, pero hay otro tipo de índice disponible que puede usar el motor sin afectar el resultado de la consulta, el motor usa el tipo disponible.

Para ver si MySQL usa un tipo de columna distinto al especificado, realice un comando o tras crear o alterar la tabla.

Otros cambios de tipo de columna pueden ocurrir si comprime una tabla usando myisampack. Consulte Sección 14.1.3.3, “Características de las tablas comprimidas”.

13.1.6. Sintaxis de DROP DATABASE

DROP {DATABASE | SCHEMA} [IF EXISTS] 

borrar todas las tablas en la base de datos y borrar la base de datos. Sea muy cuidadoso con este comando! Para usar, necesita el permiso en la base de datos.

se usa para evitar un error si la base de datos no existe.

puede usarse desde MySQL 5.0.2.

Si usa en una base de datos enlazada simbólicamente, tanto el enlace como la base de datos se borran.

retorna el número de tablas que se eliminan. Se corresponde con el número de ficheros borrados.

El comando borrar del directorio de base de datos los ficheros y directorios que MySQL puede crear durante operaciones normales:

  • Todos los ficheros con estas extensiones:

     
     
     
  • Todos los subdirectorios con nombres que tienen dos dígitos hexadecimales -. Son subdirectorios usados por tablas . (Estos directorios no se borran desde MySQL 5.0, cuando se eliminó el soporte para tablas . Debe convertir las tablas y eliminar estos directorios manualmente antes de actualizar a MySQL 5.0. Consulte Sección 2.10.1, “Aumentar la versión de 4.1 a 5.0”.)

  • El fichero , si existe.

Si permanecen otros ficheros o directorios en el directorio de la base de datos tras que MySQL borre los ficheros listados, el directorio de base de datos no puede borrarse. En este caso, debe borrar cualquier fichero restante manualmente y realizar el comando de nuevo.

Puede borrar bases de datos con mysqladmin. Consulte Sección 8.4, “Administrar un servidor MySQL con mysqladmin.

13.1.7. Sintaxis de DROP INDEX

DROP INDEX  ON 

borra el índice llamado de la tabla . En MySQL 5.0, se mapea a comando para borrar el índice. Consulte Sección 13.1.2, “Sintaxis de .

13.1.8. Sintaxis de DROP TABLE

DROP [TEMPORARY] TABLE [IF EXISTS]
     [, ] ...
    [RESTRICT | CASCADE]

borra una o más tablas. Debe tener el permiso para cada tabla. Todos los datos de la definición de tabla son borrados, así que tenga cuidado con este comando!

Use para evitar un error para tablas que no existan. Un se genera para cada tabla no existente cuando se usa . Consulte Sección 13.5.4.22, “Sintaxis de .

y se permiten para hacer la portabilidad más fácil. De momento, no hacen nada.

Nota: hace un commit automáticamente con la transacción activa,a no ser que use la palabra .

La palabra tiene el siguiente efecto:

  • El comando sólo borra tablas .

  • El comando no acaba una transacción en marcha.

  • No se chequean derechos de acceso. (Una tabla es visible sólo para el cliente que la ha creado, así que no es necesario.)

Usar es una buena forma de asegurar que no borra accidentalmente una tabla no .

13.1.9. Sintaxis de RENAME TABLE

RENAME TABLE  TO 
    [,  TO ] ...

Este comando renombra una o más tablas.

La operación de renombrar se hace automáticamente, lo que significa que ningún otro flujo puede acceder a ninguna de las tablas mientras se ejecuta el renombrado. Por ejemplo, si tiene una tabla existente , puede crear otra tabla con la misma estructura pero vacía, y luego reemplazar la tabla existente con la vacía como sigue:

CREATE TABLE  (...);
RENAME TABLE  TO ,  TO ;

Si el comando renombra más de una tabla, las operaciones de renombrado se realizan de izquierda a derecha. Si quiere intercambiar dos nombres de tablas, puede hacerlo así (asumiendo que no existe ninguna tabla llamada ):

RENAME TABLE  TO ,
              TO ,
              TO ;

Mientras haya dos bases de datos en el mismo sistema de ficheros puede renombrar una tabla para moverla de una base de datos a otra:

RENAME TABLE  TO 

Cuando ejecuta , no puede tener ninguna tabla bloqueada o transacciones activas. Debe tener los permisos y en la tabla original, y los permisos y en la nueva tabla.

Si MySQL encuentra cualquier error en un renombrado múltiple, hace un renombrado inverso para todas las tablas renombradas para devolver todo a su estado original.