mysql.h


CREATE TABLE

CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name 
  [(definición_create,...)]
  [opciones_tabla] [sentencia_select]

O

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

Sintaxis de definición_create:

    definición_columnas
  | [CONSTRAINT [símbolo]] PRIMARY KEY (index_nombre_col,...)
  | KEY [nombre_index] (nombre_col_index,...)
  | INDEX [nombre_index] (nombre_col_index,...)
  | [CONSTRAINT [símbolo]] UNIQUE [INDEX] 
       [nombre_index] [tipo_index] (nombre_col_index,...)
  | [FULLTEXT|SPATIAL] [INDEX] [nombre_index] (nombre_col_index,...)
  | [CONSTRAINT [símbolo]] FOREIGN KEY 
       [nombre_index] (nombre_col_index,...) [definición_referencia]
  | CHECK (expr)

Sintaxis de definición_columnas:

    nombre_col tipo [NOT NULL | NULL] [DEFAULT valor_por_defecto] 
        [AUTO_INCREMENT] [[PRIMARY] KEY] [COMMENT 'string'] 
        [definición_referencia]

Sintaxis de tipo:

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

Sintaxis de nombre_col_index:

        nombre_col [(longitud)] [ASC | DESC]

Sintaxis de definición_referencia:

        REFERENCES nombre_tbl [(nombre_col_index,...)]
                   [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]
                   [ON DELETE opción_referencia]
                   [ON UPDATE opción_referencia]

Sintaxis de opción_referencia:

        RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT

Sintaxis de opciones_tabla:

 opción_tabla [opción_tabla] ...

Sintaxis de opción_tabla:

    {ENGINE|TYPE} = {BDB|HEAP|ISAM|InnoDB|MERGE|MRG_MYISAM|MYISAM }
  | AUTO_INCREMENT = valor
  | AVG_ROW_LENGTH = valor
  | CHECKSUM = {0 | 1}
  | COMMENT = 'cadena'
  | MAX_ROWS = valor
  | MIN_ROWS = valor
  | PACK_KEYS = {0 | 1 | DEFAULT}
  | PASSWORD = 'cadena'
  | DELAY_KEY_WRITE = {0 | 1}
  | ROW_FORMAT = { DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNTANT|COMPACT}
  | RAID_TYPE = { 1 | STRIPED | RAID0 } 
       RAID_CHUNKS=valor
       RAID_CHUNKSIZE=valor
  | UNION = (nombre_tabla,[nombre_tabla...])
  | INSERT_METHOD = { NO | FIRST | LAST }
  | DATA DIRECTORY = 'camino de directorio absoluto'
  | INDEX DIRECTORY = 'camino de directorio absoluto'
  | [DEFAULT] CHARACTER SET nombre_conjunto_caracteres [COLLATE nombre_cotejo]

Sintaxis de sentencia_select:

    [IGNORE | REPLACE] [AS] SELECT ...     (Alguna sentencia select legal)

CREATE TABLE crea una tabla con el nombre dado. Se debe poseer el privilegio CREATE para la tabla.

Las reglas para nombres válidos de tablas se pueden ver aquí. Por defecto, la tabla se crea en la base de datos actual. Se producirá un error si la tabla ya existe, si no hay una base de datos actual o si la base de datos no existe.

En versiones de MySQL 3.22 y posteriores, el nombre de la tabla se puede especificar como db_name.tbl_name para la creación de la tabla en una base de datos específica. Esto funciona aunque no exista una base de datos seleccionada. Si se escribe el nombre de la tabla entre comillas, el nombre de la base de datos y el de la tabla se deben entrecomillar separadamente. Por ejemplo, `midb`.`mitabla` es legal, pero `midb.mitabla` no lo es.

Desde la versión 3.23 de MySQL se puede usar la palabra clave TEMPORARY cuando se quiere crear una tabla. La tabla temporal sólo es visible para la conexión actual, y será borrada automáticamente cuando se cierre la conexión. Esto significa que dos conexiones diferentes pueden usar simultaneamente el mismo nombre para una tabla temporal sin conflictos entre ellas o con una tabla existente con el mismo nombre. (La tabla existente se ocultará hasta que la tabla temporal sea borrada). Desde MySQL 4.0.2 se debe tener el privilegio CREATE TEMPORARY TABLES para que sea posible crear tablas temporales.

Desde la versión 3.23 de MySQL se puede usar IF NOT EXISTS de modo que no se obtiene un error si la tabla ya existe. No se hace verificación de si la tabla existente tiene una estructura idéntica a la indicada por la sentecia CREATE TABLE.

Cada tabla tbl_name se representa mediante algunos ficheros en el directorio de la base de datos. En el caso de tablas de tipo MyISAM se tendrá:

Fichero Propósito
tbl_name.frm Fichero de definición de formato de tabla
tbl_name.MYD Fichero de datos
tbl_name.MYI Fichero de índices

En la documentación de MySQL es posible encontrar información sobre el modo en que cada motor de almacenamiento crea los ficheros que representan las tablas.

Para detalles sobre tipos de columnas ver el capítulo 5.

De momento no hemos incluido información sobre las extensiones espaciales de MySQL (spatial).

  • Si no se especifica ni NULL ni NOT NULL, la columna se trata como si se hubiese especificado NULL.
  • Una columna entera puede tener el atributo adicional AUTO_INCREMENT. Cuando se inserta un valor NULL (que es lo recomendado) o 0 en una columna indexada AUTO_INCREMENT, se usa como valor para la columna el siguiente valor secuencial. Normalmente ese valor es valor+1, donde valor es el mayor valor en la columna actual en la tabla. Las secuencias AUTO_INCREMENT empiezan en 1. Ver mysql_insert_id.

    Nota: sólo puede existir una columna AUTO_INCREMENT por tabla, debe estar indexada y no puede tener un valor DEFAULT.

    En la versión 3.23 de MySQL una columna AUTO_INCREMENT sólo funcionará correctamente si contiene valores positivos. La inserción de un número negativo se considera como un número positivo muy grande. Esto se hace para evitar que por problemas de precisión números pasen de positivo a negativo y también para asegurar que accidentalmente una columna AUTO_INCREMENT contenga un cero. En tablas MyISAM y BDB se puede especificar AUTO_INCREMENT en una columna secundaria dentro de una clave multi-columna. Para hacer MySQL compatible con algunas aplicaciones ODBC, se puede encontrar el valor AUTO_INCREMENT para la última fila insertada mediante la siguiente consulta:

    SELECT * FROM tbl_name WHERE auto_col IS NULL
  • Desde la versión 4.1 de MySQL, las definiciones de columnas de caracteres pueden incluir un atributo CHARACTER SET para especificar el conjunto de caracteres y, opcionalmente, un conjunto de reglas de comparación para la columna. Ver apéndice G.

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

    También desde la versión 4.1, MySQL interpreta las especificaciones de longitud en definiciones de columnas de texto en caracteres. (Versiones anteriores las interpretaban en bytes.)

  • Los valores NULL se manejan de modo diferente para columnas del tipo TIMESTAMP que para otros tipos. Antes de la versión 4.1.6 de MySQL no era posible almacenar un literal NULL en una columna TIMESTAMP; un valor NULL para la columna le asignaba el valor de fecha y hora actual. Debido a ese comportamiento de TIMESTAMP, los atributos NULL y NOT NULL no se aplicaban del modo normal, y eran ignorados si se especifican. Por otra parte, para hacer más fácil para los clientes MySQL el uso de columnas TIMESTAMP, el servidor informa que a esas columnas se les puede asignar valores NULL, lo cual es cierto, aunque TIMESTAMP nunca puede contener un valor NULL. Es posible ver esto cuando se usa DESCRIBE tbl_name para obtener la descripción de una tabla. Por cierto, asignar 0 a una columna TIMESTAMP no es lo mismo que asignar NULL, ya que 0 es un valor válido para TIMESTAMP.
  • La cláusula DEFAULT especifica un valor por defecto para una columna. Con una excepción, el valor por defecto debe ser una constante, no puede ser una función o una expresión. Esto significa, por ejemplo, que no se puede asignar como fecha por defecto para una columna el valor de una función como NOW() o CURRENT_DATE. La excepción es que se puede asignar CURRENT_TIMESTAMP como el valor por defecto par auna columna TIMESTAMP desde la versión 4.1.2 de MySQL. Si no se especifica un valor explicito por defecto para una columna, MySQL automáticamente asigna uno, como sigue. Si la columna puede tomar un valor NULL, la columna se define con una cláusula DEFAULT NULL explícita. Si la columna no puede tomar el valor NULL, MySQL define la columna con una cláusula DEFAULT explícita, usando el valor implícito para el tipo de columna. El valor por defecto implícito se define como:

    • Para tipos numéricos no declarados con el atributo AUTO_INCREMENT, el valor por defecto es 0. Para las columnas AUTO_INCREMENT, el valor por defecto es el siguiente valor dentro de la secuencia.
    • Para tipos de fecha y tiempo distintos de TIMESTAMP, el valor por defecto es el valor cero apropiado para el tipo. Para la primera columna TIMESTAMP de la tabla, el valor por defecto es la fecha y hora actuales.
    • Para tipos de cadena distintos de ENUM, el valor por defecto es la cadena vacía. Para los ENUM, el valor por defecto es el primero valor de la enumeración.

    A las columnas BLOB y TEXT no se les puede asignar un valor por defecto.

  • Se puede especificar un comentario para una columna con la opción COMMENT. El comentario se muestra mediante la sentencia SHOW CREATE TABLE, y por SHOW FULL COLUMNS. Esta opción está disponible desde MySQL 4.1. (Está permitida pero se ignora en versiones anteriores.)
  • Desde la versión 4.1.0 de MySQL 4.1.0, se puede usar el atributo SERIAL como un alias para BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE. Esta es una característica de compatibilidad.
  • KEY normalmente es sinónimo de INDEX. Desde la versión 4.1, el atributo de clave PRIMARY KEY puede especificarse también como KEY. Esto se ha implementado para compatibilidad con otras base de datos.
  • En MySQL, una clave UNIQUE sólo puede contener valores diferentes. Se produce un error si se intenta insertar una fila nueva con una clave que coincida con la de una fila existente. La excepción es si una columna en el índice puede tomar valores NULL, entonces puede contener múltiples valores NULL. Esta excepción no se aplica a tablas BDB, para las que una columna indexada permite sólo un valor NULL.
  • Una PRIMARY KEY es una KEY única donde todas las columnas clave deben estar definidas como NOT NULL. Si no están declarados específicamente como NOT NULL, debe hacerse implícitamente (y discretamente). Una tabla sólo puede contener una PRIMARY KEY. Si no se tiene una y alguna aplicación solicita una, MySQL devolverá el primer índice UNIQUE que no tenga columnas NULL, como PRIMARY KEY.
  • En la tabla creada, una PRIMARY KEY se coloca la primera, seguida por todos los índices UNIQUE, y después los índices no únicos. Esto ayuda al optimizador de MySQL para dar prioridad sobre qué índice usar y para detectar más rápidamente claves UNIQUE duplicadas.
  • Una PRIMARY KEY puede se un índice multicolumna. Sin embargo, no se puede crear un índice multicolumna usando el atributo PRIMARY KEY en la especificación de columna. Hacer esto marca sólo esa columna como primaria. Se debe usar una cláusula adicional PRIMARY KEY(nombre_col_index, ...).
  • Si la clave PRIMARY o UNIQUE consiste sólo en una columna y es de tipo entero, se puede también referenciar como _rowid en una sentencia SELECT (desde la Versión 3.23.11).
  • En MySQL, el nombre de un PRIMARY KEY es PRIMARY. Para otros índices, si no se asigna un nombre, se le asigna el mismo nombre que la primera columna indexada, con un sufijo opcional (_2, _3. ...) para hacerlo único. Se pueden ver los nombres de los índices usando la sentencia SHOW INDEX FROM nombre_tabla.
  • Desde MySQL 4.1.0, algunos motores de almacenamiento premiten especificar un tipo de índice cuando este es creado. La sintaxis para el especificador de tipo_indice es USING nombre_tipo. Por ejemplo:

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

    Ver CREATE INDEX para más detalles.

  • Sólo las tablas de tipos MyISAM, InnoDB, BDB y (desde MySQL 4.0.2) MEMORY soportan índices en columnas que contengan valors NULL. En otros casos se deben declarar esas columnas como NOT NULL o se producirá un error.
  • Con al sintaxis col_name(longitud) en una especificación de un índice, se puede crear un índice que use sólo los primeros 'longitud' bytes de una columna CHAR o VARCHAR. Esto puede hacer que el fichero de índices sea mucho más pequeño. Las tablas de tipos MyISAM y (desde MySQL 4.0.14) InnoDB soportan indexación en columnas BLOB y TEXT. Cuando se usa un índice en una columna BLOB o TEXT se debe especificar siempre la longitud de los índices. Por ejemplo:

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

    Los prefijos pueden tener hasta 255 bytes de longitud (o 1000 bytes para tablas MyISAM y InnoDB desde MySQL 4.1.2). Notar que los límites de los prefijos se miden en bytes, aunque la longitud del prefijo en sentencias CREATE INDEX se interpretan como número de caracteres. Hay que tener esto en cuenta cuando se especifica una longitud de prefijo para una columna que usa un conjunto de caracteres multi-byte.

  • Una especificación de nombre_col_index puede terminar con ASC o DESC. Estas palabras clave están permitidas para futuras extensiones para la especificación de almacenamiento de índices ascendentes o descendentes. Actualmente se verifica su sintaxis, pero se ignoran; los valores de índices siempre se almacenan en orden ascendente.
  • Cuando se usa ORDER BY o GROUP BY con una columna TEXT o BLOB, el servidor ordena los valores usando sólo los bytes iniciales indicados por la variable del servidor max_sort_length.
  • En versiones de MySQL 3.23.23 o posteriores, se pueden crear índices especiales FULLTEXT. Se usan para búsquedas de texto completo. Sólo las tablas de tipo MyISAM soportan índices FULLTEXT. Sólo pueden ser creados desde columnas CHAR, VARCHAR y TEXT. La indexación siempre se hace sobre la columna completa; la indexación parcial no está soportada y cualquier longitud de prefijo es ignorada si se especifica.
  • A partir de MySQL 4.1, se pueden crear índices SPATIAL en columnas de tipo espacial. Los tipos espaciales se soportan sólo para tablas MyISAM y las columnas indexadas deben declararse como NOT NULL.
  • A partir de la versión 3.23.44 de MySQL, las tablas InnoDB soportan verificación para restricciones de claves foráneas. Hay que tener en cuenta que la sintaxis para FOREIGN KEY en InnoDB es mucho más restrictiva que la sintaxis presentada antes: las columnas en la tabla referenciada deben ser nombradas explícitamente. InnoDB soporta las acciones ON DELETE y ON UPDATE para claves ajenas tanto para MySQL 3.23.50 como para 4.0.8, respectivamente. Para otros tipos de tablas, el servidor MySQL verifica la sintaxis de FOREIGN KEY, CHECK y REFERENCES en comandos CREATE TABLE, pero no se toma ninguna acción.
  • Para tablas MyISAM y ISAM, cada columna NULL requiere un bit extra, redondeando hacia arriba al siguiente byte. El tamaño máximo para un registro, en bytes, puede calcularse del siguiente modo:

    row length = 1
                 + (sum of column lengths)
                 + (number of NULL columns + delete_flag + 7)/8
                 + (number of variable-length columns)

    El delete_flag es 1 para tablas con formato de registro estático. Las tablas estáticas usan un bit en una fila de registro como un banderín que indica si la fila ha sido borrada.

    delete_flag es 0 para tablas dinámicas porque el banderín se almacena en una fila de cabecera dinámica. Estos cálculos no se aplican a tablas InnoDB, para las que el tamaño de almacenamiento no es diferente para columnas NULL en comparación con las NOT NULL.

La parte opciones_tabla de CREATE TABLE sólo están disponibles desde MySQL 3.23.

Las opciones ENGINE y TYPE especifican el motor de almacenamiento para la tabla. ENGINE se añadió en MySQL 4.0.18 (para 4.0) y 4.1.2 (para 4.1). Esta es la opción aconsejada desde esas versiones, y TYPE queda desaconsejada. TYPE será soportada a lo largo de la serie 4.x series, pero será eliminada en MySQL 5.1.

Las opciones ENGINE y TYPE pueden tomar los valores siguientes:

Motor de almacenamiento Descripción
BDB Tablas de transacción segura con bloqueo de página.
BerkeleyDB Alias para BDB.
HEAP Los datos para esta tabla sólo se almacenan en memoria.
ISAM El motor de almacenamoento original de MySQL.
InnoDB Tablas de transacción segura con bloqueo de fila y claves foráneas.
MEMORY Alias para HEAP.
MERGE Una colección de tablas MyISAM usadas como una tabla.
MRG_MyISAM Un alias para MERGE.
MyISAM El nuevo motor binario de almacenamiento portable que reemplaza a ISAM.

Si se especifica un tipo de tabla, y ese tipo particular no está disponible, MySQL usará el tipo MyISAM. Por ejemplo, si la definición de la tabla incluye la opción ENGINE=BDB pero el servidor MySQL no soporta tablas BDB, la tabla se creará como una tabla MyISAM. Esto hace posible tener un sistema de réplica donde se tienen tablas operativas en el maestro pero las tablas creadas en el esclavo no son operativas (para obtener mayor velocidad). En MySQL 4.1.1 se obtiene un aviso si el tipo de tabla especificado no es aceptable.

Las otras opciones de tabla se usan para optimizar el comportamiento de la tabla. En la mayoría de los casos, no se tendrá que especificar ninguna de ellas. Las opciones trabajan con todos los tipos de tabla, salvo que se indique otra cosa:

Option Descripción
AUTO_INCREMENT El valor inicial AUTO_INCREMENT que se quiere seleccionar para la tabla. Sólo funciona en tablas MyISAM. Para poner el primer valor de un auto-incrementado para una tabla InnoDB, insertar una fila vacía con un valor una unidad menor, y después borrarla.
AVG_ROW_LENGTH Una aproximación de la longitud media de fila de la tabla. Sólo se necesita esto para tablas largas con tamaño de registro variable. When you create a MyISAM table, MySQL uses the product of the MAX_ROWS and AVG_ROW_LENGTH options to decide how big the resulting table will be. If you don't specify either option, the maximum size for a table will be 4GB (or 2GB if your operating system only supports 2GB tables). The reason for this is just to keep down the pointer sizes to make the index smaller and faster if you don't really need big files. If you want all your tables to be able to grow above the 4GB limit and are willing to have your smaller tables slightly slower and larger than necessary, you may increase the default pointer size by setting the myisam_data_pointer_size system variable, which was added in MySQL 4.1.2.
CHECKSUM Ponerlo a 1 si se quiere que MySQL mantenga un checksum para todas las filas (es decir, un checksum que MySQL actualiza automáticamente cuando la tabla cambia. Esto hace la tabla un poco más lenta al actualizar, pero hace más sencillo localizar tablas corruptas. La sentencia CHECKSUM TABLE devuelve el valor del checksum. (Sólo MyISAM).
COMMENT Un comentario de 60 caracteres para la tabla.
MAX_ROWS Número máximo de filas que se planea almacenar en la tabla.
MIN_ROWS Mínimo número de filas que se planea almacenar en la tabla.
PACK_KEYS Ponerlo a 1 si se quiere tener índices más pequeños. Esto normalmente hace que las actualizaciones sean más lentas y las lecturas más rápidas. Ponerlo a 0 desactiva cualquier empaquetado de claves. Ponerlo a DEFAULT (MySQL 4.0) indica al motor de almacenamiento que sólo empaquete columnas CHAR/VARCHAR largas. (Sólo MyISAM y ISAM). Si no se usa PACK_KEYS, por defecto sólo se empaquetan cadenas, no números. Si se usa PACK_KEYS=1, los números serán empaquetados también. Cuando se empaquetan claves de números binarios, MySQL usa compresión con prefijo:
  • Cada clave necesita un byte extra para indicar cuantos bytes de la clave anterior son iguales en la siguiente.
  • El puntero a la fila se almacena guardando primero el byte de mayor peso directamente después de la clave, para mejorar la compresión.
Esto significa que si existen muchas claves iguales en dos filas consecutivas, todas las claves "iguales" que sigan generalmente sólo necesitarán dos bytes (incluyendo el puntero a la fila). Comparar esto con el caso corriente, donde las claves siguientes tendrán tamaño_almacenamiento_clave + tamaño_puntero (donde el tamaño del puntero normalmente es 4). Por otra parte, sólo se obtendrá un gran beneficio de la compresión prefija si hay muchos números que sean iguales. Si todas las claves son totalmente distintas, se usará un byte más por clave, si la clave no es una que pueda tener valores NULL. (En ese caso, la longitud de la clave empaquetada será almacenada en el mismo byte que se usa para marcar si la clave es NULL.)
PASSWORD Encripta el fichero `.frm' con un password. Esta opción no hace nada en la versión estándar de MySQL.
DELAY_KEY_WRITE Poner esto a 1 si se quiere posponer la actualización de la tabla hasta que sea cerrada (sólo MyISAM).
ROW_FORMAT Define cómo deben almacenarse las filas. Actualmente esta opción sólo funciona con tablas MyISAM. El valor de la opción puede ser DYNAMIC o FIXED para formatos de fila estático o de longitud variable.
RAID_TYPE La opción RAID_TYPE permite exceder el límite de 2G/4G para un fichero de datos MyISAM (no el fichero de índice) en sistemas operativos que no soportan ficheros grandes. Observese que esta opción es innecesaria y no se recomienda para sistemas de ficheros que soporten ficheros grandes. Se puede obtener mayor velocidad de cuellos de botella de entrada/salida usando directorios RAID en discos físicos diferentes. Por ahora, el único valor permitido para RAID_TYPE es STRIPED. 1 y RAID0 son alias de STREPED. Si se especifica al opción RAID_TYPE para una tabla MyISAM, también es posible especificar las opciones RAID_CHUNKS y RAID_CHUNKSIZE. El valor máximo para RAID_CHUNCKS es 255. MyISAM creará RAID_CHUNKS subdirectorios con los nombres '00', '01', '02',... '09', '0a', '0b,... en el directorio de la base de datos. En cada uno de esos directorios, MyISAM creará un "table_name.MYD". Cuando se escriban datos al fichero de datos, el manipulador RAID mapea los primeros RAID_CHUNKSIZE *1024 bytes al primer fichero, los siguientes RAID_CHUNKSIZE *1024 bytes al siguiente, y así sucesivamente. RAID_TYPE funciona en cualquier sistema operativo, siempre que se construya MySQL con la opción de configuración --with-raid. Para determinar si el servidor soporta tablas RAID, usar SHOW VARIABLES LIKE 'have_raid' para ver si el valor de la variable es YES.
UNION UNION se usa cuando se quiere usar una colección de tablas idénticas como una. Esto sólo funciona con tablas MERGE. Por el momento es necesario tener los privilegios SELECT, UPDATE y DELETE en las tablas a mapear en una tabla MERGE. Originalmente, todas las tablas mapeadas deben pertenecer a la misma base de datos que la propia tabla MERGE. Esta restricción ha sido eliminada a partir de MySQL 4.1.1.
INSERT_METHOD Si se quiere insertar tados en una tabla MERGE, se debe especificar con INSERT_METHOD dentro de qué la tabla se insertará la fila. INSERT_METHOD es una opción frecuente sólo en tablas MERGE. Esta opción se introdujo en MySQL 4.0.0.
DATA DIRECTORY
INDEX DIRECTORY
Usando DATA DIRECTORY='directory' o INDEX DIRECTORY='directory' se puede especificar dónde colocará el motor de almacenamiento el fichero de datos y el de índices. Este directorio debe ser un camino completo al directorio (no un camino relativo). Esto sólo funciona con tablas MyISAM desde MySQL 4.0, cuando no se está usando la opción --skip-symlink.

A partir de MySQL 3.23, se puede crear una tabla a partir de otra añadiendo la sentencia SELECT al final de la sentencia CREATE TABLE:

CREATE TABLE new_tbl SELECT * FROM orig_tbl;

MySQL creará nuevos campos para todos los elementos del SELECT. 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 creará una tabla MyISAM con tres columnas, a, b y c. Hay que tener en cuenta que esas tres columnas de la sentencia SELECT se añaden al lado derecho de la tabla, no superpuestos. Ver 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 fila en la tabla foo, se inserta una fila en bar con los valores de foo y los valores por defecto para las nuevas columnas.

Si se produce cualquier error mientras se copian los datos a la tabla, esta se eliminará automáticamente y no se creará.

CREATE TABLE ... SELECT no creará indices de forma automática. Esto se ha hecho de forma intencionada para hacer el comando tan flexible como sea posible. Si se quiere tener índices en la tabla creada, se puede especificar después de la sentencias SELECT:

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

Se pueden producir algunas conversiones de tipos de columna. Por ejemplo, el atributo AUTO_INCREMENT no se preserva, y columasn VARCHAR se pueden convertir en CHAR.

Cuando se crea una tabla con CREATE ... SELECT, hay que asegurarse de crear alias para cualquier llamada a función o expresión en la consulta. Si no se hace, la sentencia CREATE podrá fallar o pueden resultar nombres de columna 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;

Desde MySQL 4.1, se puede especificar explícitamente el tipo para una columna generada:

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

En MySQL 4.1, también se puede usar LIKE para crear una tabla vacía basada en la definición de otra tabla, incluyendo cualquier atributo de columna e indices que tenga la tabla original:

CREATE TABLE new_tbl LIKE orig_tbl;

CREATE TABLE ... LIKE no copia ninguna opción de tabla DATA DIRECTORY o INDEX DIRECTORY que se haya especificado en la tabla original, o cualquier definición de clave foránea.

Se puede preceder el SELECT por IGNORE o REPLACE para indicar como manipular registros que dupliquen claves únicas. Con IGNORE, los nuevos registros que dupliquen la clave única de un registro existente serán descartados. Con REPLACE, los nuevos registros reemplazan a los que tengan el mismo valor de clave única. Si no se especifica IGNORE ni REPLACE, la repetición de claves únicas producirá un error.

Para asegurar que el diario de modificación puede ser usado para recrear las tablas originales, MySQL no permite la inserción concurrente durante CREATE TABLE ... SELECT.

Cambios de especificaciones de columna sin notificación

En algunos casos, MySQL hace cambios en las especificaciones de columna dadas en una sentencia CREATE TABLE o ALTER TABLE sin notificarlo:

  • Las columnas VARCHAR con una longitud menor de cuatro se cambian a CHAR.
  • Si cualquier columna en una tabla tiene una longitud variable, la fila completa se convierte en una de longitud variable. Del mismo modo, si una tabla contiene alguna columna de longitud variable (VARCHAR, TEXT o BLOB), todas las columnas CHAR de más de cuatro caracteres se cambian a columnas VARCHAR. Esto no afecta al modo en que se usen estas columnas; en MySQL, VARCHAR es sólo una forma diferente de almacenar caracteres. MySQL realiza esta conversión porque esto ahorra espacio y hace las operaciones en la tabla más rápidas.
  • A partir de MySQL 4.1.0, una columna CHAR o VARCHAR con una especificación de longitud mayor de 255 se convierte al tipo TEXT más pequeño que pueda contener valores de la longitud dada. Por ejemplo, VARCHAR(500) se convierte a TEXT, y VARCHAR(200000) se convierte a MEDIUMTEXT. Esto es un comportamiento para compatibilidad.
  • Los tamaños de visualización de TIMESTAMP han sido descartados a partir de MySQL 4.1, debido a las modificaciones hechas al tipo de columna TIMESTAMP en esta versión. Antes de MySQL 4.1, los tamaños de visualización de TIMESTAMP deben aparecer siempre, y estar en el rango desde 2 a 14. Si se especifica un tamaño de visualización de 0 ó mayor que 14, el tamaño se ajusta a 14. Los valores impares en el rango entre 1 a 13 se ajustan al siguiente valor par.
  • No se puede almacenar un valor literal NULL en una columna TIMESTAMP; asignar el valor NULL equivale a asignar el valor de fecha y hora actual. Debido a este comportamiento de las columnas TIMESTAMP, los atributos NULL y NOT NULL no se aplican de la forma normal y se ignoran si se especifican. DESCRIBE tbl_name siempre informa que a una columna TIMESTAMP se puede le pueden asignar valores NULL.
  • Columnas que forman parte de una PRIMARY KEY se harán NOT NULL aunque no se hayan declarado de ese modo.
  • A partir de MySQL 3.23.51, los espacios inciciales son borrados automáticamente de las valores de los miembros ENUM y SET cuando la tabla es creada.
  • MySQL mapea ciertos tipos de columna usados por otros productos de bases de datos SQL a los tipos de MySQL.
  • Si se incluye una cláusula USING para especificar un tipo índice que no es legal para un motor de almacenamiento, pero hay algún otro tipo de índice disponible que el motor puede usar sin afectar a los resultados de la consulta, el motor usará el tipo disponible.

Para comprobar si MySQL ha usado un tipo de columna diferente del especificado, se puede usar una sentencia DESCRIBE o SHOW CREATE TABLE después de crear la tabla o alterar una tabla.

Pueden producirse otros cambios de tipo de columna si se comprime una tabla usando myisampack.