CREATE [TEMPORARY] TABLE [IF NOT EXISTS]tbl_name
[(create_definition
,...)] [table_options
] [select_statement
]
O:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS]tbl_name
[(] LIKEold_tbl_name
[)];create_definition
:column_definition
| [CONSTRAINT [symbol
]] PRIMARY KEY [index_type
] (index_col_name
,...) | KEY [index_name
] [index_type
] (index_col_name
,...) | INDEX [index_name
] [index_type
] (index_col_name
,...) | [CONSTRAINT [symbol
]] UNIQUE [INDEX] [index_name
] [index_type
] (index_col_name
,...) | [FULLTEXT|SPATIAL] [INDEX] [index_name
] (index_col_name
,...) | [CONSTRAINT [symbol
]] FOREIGN KEY [index_name
] (index_col_name
,...) [reference_definition
] | CHECK (expr
)column_definition
:col_name
type
[NOT NULL | NULL] [DEFAULTdefault_value
] [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY] [COMMENT 'string
'] [reference_definition
]type
: TINYINT[(length
)] [UNSIGNED] [ZEROFILL] | SMALLINT[(length
)] [UNSIGNED] [ZEROFILL] | MEDIUMINT[(length
)] [UNSIGNED] [ZEROFILL] | INT[(length
)] [UNSIGNED] [ZEROFILL] | INTEGER[(length
)] [UNSIGNED] [ZEROFILL] | BIGINT[(length
)] [UNSIGNED] [ZEROFILL] | REAL[(length
,decimals
)] [UNSIGNED] [ZEROFILL] | DOUBLE[(length
,decimals
)] [UNSIGNED] [ZEROFILL] | FLOAT[(length
,decimals
)] [UNSIGNED] [ZEROFILL] | DECIMAL(length
,decimals
) [UNSIGNED] [ZEROFILL] | NUMERIC(length
,decimals
) [UNSIGNED] [ZEROFILL] | DATE | TIME | TIMESTAMP | DATETIME | CHAR(length
) [BINARY | ASCII | UNICODE] | VARCHAR(length
) [BINARY] | TINYBLOB | BLOB | MEDIUMBLOB | LONGBLOB | TINYTEXT [BINARY] | TEXT [BINARY] | MEDIUMTEXT [BINARY] | LONGTEXT [BINARY] | ENUM(value1
,value2
,value3
,...) | SET(value1
,value2
,value3
,...) |spatial_type
index_col_name
:col_name
[(length
)] [ASC | DESC]reference_definition
: REFERENCEStbl_name
[(index_col_name
,...)] [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE] [ON DELETEreference_option
] [ON UPDATEreference_option
]reference_option
: RESTRICT | CASCADE | SET NULL | NO ACTIONtable_options
:table_option
[table_option
] ...table_option
: {ENGINE|TYPE} =engine_name
| AUTO_INCREMENT =value
| AVG_ROW_LENGTH =value
| [DEFAULT] CHARACTER SETcharset_name
[COLLATEcollation_name
] | CHECKSUM = {0 | 1} | COMMENT = 'string
' | MAX_ROWS =value
| MIN_ROWS =value
| PACK_KEYS = {0 | 1 | DEFAULT} | PASSWORD = 'string
' | DELAY_KEY_WRITE = {0 | 1} | ROW_FORMAT = {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT} | RAID_TYPE = { 1 | STRIPED | RAID0 } RAID_CHUNKS =value
RAID_CHUNKSIZE =value
| UNION = (tbl_name
[,tbl_name
]...) | INSERT_METHOD = { NO | FIRST | LAST } | DATA DIRECTORY = 'absolute path to directory
' | INDEX DIRECTORY = 'absolute path to directory
'select_statement:
[IGNORE | REPLACE] [AS] SELECT ... (Some legal select statement
)
CREATE TABLE
crea una tabla con el nombre
dado. Debe tener el permiso CREATE
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
db_name.tbl_name
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, `mydb`.`mytbl`
es legal, pero
`mydb.mytbl`
no.
Puede usar la palabra TEMPORARY
al crear una
tabla. Una tabla TEMPORARY
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
TEMPORARY
con el mismo nombre. (La tabla
existente se oculta hasta que se borra la tabla temporal.) En
MySQL 5.0, debe tener el permiso CREATE TEMPORARY
TABLES
para crear tablas temporales.
MySQL 5.0 soporta las palabras IF NOT EXISTS
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
CREATE TABLE
. Nota: Si
usa IF NOT EXISTS
en un comando
CREATE TABLE ... SELECT
,cualquier registro
seleccionado por la parte SELECT
se inserta
si la tabla existe o no.
MySQL representa cada tabla mediante un fichero
.frm
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
MyISAM
, el motor crea ficheros índice y de
datos. Por lo tanto, para cada tabla MyISAM
tbl_name
, hay tres ficheros de disco:
Fichero | Propósito |
|
Fichero de formato de tabla (definición) |
|
Fichero de datos |
|
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 NULL
ni NOT
NULL
, la columna se trata como si se especificara
NULL
.
Una columna entera puede tener el atributo adicional
AUTO_INCREMENT
. Cuando inserta un valor
de NULL
(recomendado) o
0
en una columna
AUTO_INCREMENT
autoindexada, la columna
se asigna al siguiente valor de secuencia. Típicamente esto
es
,
donde value
+1value
es el mayor valor
posible para la columna en la tabla. Secuencias
AUTO_INCREMENT
comienzan con
1
. 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.2.3.34, “mysql_insert_id()
”.
En MySQL 5.0, especificar
NO_AUTO_VALUE_ON_ZERO
para la opción de
servidor --sql-mode
o la variable de
sistema sql_mode
le permite almacenar
0
en columnas
AUTO_INCREMENT
como 0
sin generar un nuevo valor de secuencia. Consulte
Sección 5.3.1, “Opciones del comando mysqld”.
Nota: Sólo puede haber una
columna AUTO_INCREMENT
por tabla, debe
estar indexada, y no puede tener un valor
DEFAULT
. Una columna
AUTO_INCREMENT
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 AUTO_INCREMENT
que contenga
0
.
Para tablas MyISAM
y
BDB
, puede especificar una columna
AUTO_INCREMENT
secundaria en una clave de
múltiples columnas. Consulte
Sección 3.6.9, “Utilización de AUTO_INCREMENT
”.
Para hacer MySQL compatible con otras aplicaciones ODBC ,
puede encontrar el valor AUTO_INCREMENT
para el último registro insertado con la siguiente
consulta:
SELECT * FROMtbl_name
WHEREauto_col
IS NULL
En MySQL 5.0, las definiciones de columnas de caracteres
puede incluir un atributo CHARACTER SET
para especificar el conjunto de caracteres y, opcionalmente,
una colación para la columna. Para detalles, consulte
Capítulo 10, Soporte de conjuntos de caracteres. CHARSET
es
sinónimo de CHARACTER SET
.
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 caracteres. (Algunas versiones anteriores los interpretan en bytes.)
La cláusula DEFAULT
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 NOW()
o
CURRENT_DATE
. La excepción es que pude
especificar CURRENT_TIMESTAMP
como
defecto para columnas TIMESTAMP
.
Consulte Sección 11.3.1.1, “Propiedades de TIMESTAMP
desde MySQL 4.1”.
Antes de MySQL 5.0.2, si una definición de columna no
incluye valor DEFAULT
explícito, MySQL
determina el valor por defecto como sigue:
Si la columna puede tener valores NULL
,
la columna se define como una cláusula DEFAULT
NULL
explícita.
Si la columna no puede tener valores NULL
, MySQL define la columna con una cláusula
DEFAULT
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 AUTO_INCREMENT
, por defecto
es 0
. Para una columna
AUTO_INCREMENT
, el valor por defecto
es el siguiente valor de la secuencia.
Para tipos de fecha y hora distintos a
TIMESTAMP
, el valor por defecto es el
valor “cero” apropiado para el tipo. Para
la primera columna TIMESTAMP
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
ENUM
, el valor por defecto es la
cadena vacía. Para ENUM
, el valor
por defecto es el primer valor de la enumeración.
Las columnas BLOB
y
TEXT
no pueden tener un valor por
defecto.
Desde MySQL 5.0.2, si una definición de columna no incluye
valor DEFAULT
explícito , MySQL
determina el valor por defecto como sigue:
Si la columna puede tener NULL
como
valor, la columna se define con una cláusula
DEFAULT NULL
explícita. Esto es lo mismo
que antes de 5.0.2.
Si la columna no puede tener valores NULL
, MySQL define la columna sin cláusula
DEFAULT
explícita. Para entradas de
datos, si un comando INSERT
o
REPLACE
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 t
se define como
sigue:
CREATE TABLE t (i INT NOT NULL);
En este caso, i
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
DEFAULT(i)
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 SHOW
CREATE TABLE
para ver qué columnas puede tener
una cláusula explícita DEFAULT
.
Un comentario para una columna puede especificarse en MySQL
5.0 con la opción COMMENT
. El
comentario se muestra con los comandos SHOW CREATE
TABLE
y SHOW FULL COLUMNS
.
En MySQL 5.0, el atributo SERIAL
puede
usarse como un alias para BIGINT UNSIGNED NOT NULL
AUTO_INCREMENT UNIQUE
.
KEY
normalemente es sinónimo para
INDEX
. En MySQL 5.0, el atributo clave
PRIMARY KEY
puede especificarse como
KEY
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 UNIQUE
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
NULL
, puede contener valores
NULL
múltiples. Esta excepción no se
aplica a tablas BDB
, en las que una
columna indexada le permita un único
NULL
.
Una PRIMARY KEY
es una
KEY
única donde todas las columnas de la
clave deben definirse como NOT NULL
. Si
no se declaran explícitamente como NOT
NULL
, MySQL las declara implícitamente ( y sin
decirlo ) . Una tabla puede tener sólo una PRIMARY
KEY
. Si no tiene una PRIMARY
KEY
y una aplicación pide una PRIMARY
KEY
en sus tablas, MySQL retorna el primer índice
UNIQUE
que no tenga columnas
NULL
como la PRIMARY
KEY
.
En la tabla creada, una PRIMARY KEY
se
guarda en primer lugar, seguida por todos los índices
UNIQUE
, 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
UNIQUE
duplicadas.
Una PRIMARY KEY
puede ser un índice de
múltiples columnas. Sin embargo, no puede crear un índice
de múltiples columnas usando el atributo de clave
PRIMARY KEY
en una especificación de
columna. Hacerlo sólo marca la columna como primaria. Debe
usar una cláusula PRIMARY KEY(index_col_name,
...)
separada.
Si un índice PRIMARY KEY
o
UNIQUE
consite sólo de una columna que
tenga un tipo entero, puede referirse a la columna como
_rowid
en comandos
SELECT
.
En MySQL, el nombre de una PRIMARY KEY
es
PRIMARY
. Para otros índices, si no
asigna un nombre, el índice tieen el mismo nombre que la
primera columna indexada, con un sufijo opcional
(_2
, _3
,
...
) para hacerlo único. Puede ver los
nombres de índice para una tabla usando SHOW INDEX
FROM
. Consulte
Sección 13.5.4.11, “Sintaxis de tbl_name
SHOW INDEX
”.
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 CREATE INDEX
”.
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 MyISAM
,
InnoDB
, BDB
, y
MEMORY
soporta índices en columnas que
pueden tener valores NULL
. En otros
casos, debe declarar columnas indexadas como NOT
NULL
u ocurre un error.
Con sintaxis
en una especificación de índice, puede crear un índice
que use sólo los primeros col_name
(length
)length
caracteres de una columna CHAR
o
VARCHAR
. 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 MyISAM
y
InnoDB
soportan indexación en columnas
BLOB
y TEXT
. Al
indexar columnas BLOB
o
TEXT
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 MyISAM
y
InnoDB
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
CREATE TABLE
se interpretan como el
número de caracteres. Asegúrese de tener esto en cuenta al
especificar una longitud de prefijo para una columna que use
un conjunto de caracteres multi-byte .
Una especificación
index_col_name
puede acabar con
ASC
o DESC
. 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 ORDER BY
o GROUP
BY
en una columna TEXT
o
BLOB
en un SELECT
, el
servidor ordena los valores usando sólo el número inicial
de bytes indicados por la variable de sistema
max_sort_length
. Consulte
Sección 11.4.3, “Los tipos BLOB
y TEXT
”.
En MySQL 5.0, puede crear índices especiales
FULLTEXT
, que se usan para índices
full-text . Sólo las tablas MyISAM
soportan índices FULLTEXT
. Pueden
crearse sólo desde columnas CHAR
,
VARCHAR
, y TEXT
. 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
SPATIAL
en tipos de columna espaciales.
Los tipos espaciales se soportan sólo para tablas
MyISAM
y las columnas indexadas deben
declararase como NOT NULL
. Consulte
Capítulo 18, Extensiones espaciales de MySQL.
En MySQL 5.0, las tablas InnoDB
soportan
el chequeo de restricciones de claves foráneas . Consulte
Capítulo 15, El motor de almacenamiento InnoDB
. Tenga en cuenta que la sintaxis
FOREIGN KEY
en InnoDB
es más restrictiva que la sintaxis presentada para el
comando CREATE TABLE
al inicio de esta
sección: las columnas en la tabla referenciada debe siempre
nombrarse explícitamente. InnoDB
soporta
tanto acciones ON DELETE
como ON
UPDATE
en MySQL 5.0. Para la sintaxis precisa,
consulte Sección 15.6.4, “Restricciones (constraints) FOREIGN KEY
”.
Para otros motores de almacenamiento, MySQL Server parsea la
sintaxis FOREIGN KEY
y
REFERENCES
en comandos CREATE
TABLE
, pero no hace nada. La cláusula
CHECK
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 MyISAM
cada columna
NULL
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 + (sum of column lengths
) + (number of NULL columns
+delete_flag
+ 7)/8 + (number of variable-length columns
)
delete_flag
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. delete_flag
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
InnoDB
, en las que el tamaño de
almacenamiento no es distinto para columnas
NULL
y NOT NULL
.
La parte table_options
de la sintaxis
CREATE TABLE
puede usarse desde MySQL 3.23.
Las opciones ENGINE
y TYPE
especifican el motor de almacenamiento para la tabla.
ENGINE
es el nombre preferido para la opción
en MySQL 5.0, y TYPE
está obsoleto. El
soporte para la palabra TYPE
usada en este
contexto desaparecerá en MySQL 5.1.
Las opciones ENGINE
y TYPE
pueden tener los siguientes valores:
Motor de almacenamiento | Descripción |
ARCHIVE |
El motor de almacenamiento para archivar. Consulte
Sección 14.7, “El motor de almacenamiento ARCHIVE ”. |
BDB |
Tablas transaccionales con bloqueo de página. Conocidas como
BerkeleyDB . Consulte
Sección 14.4, “El motor de almacenamiento BDB
(BerkeleyDB )”. |
CSV |
Tablas que almacenan registros en valores separados por comas. Consulte
Sección 14.8, “El motor de almacenamiento CSV ”. |
EXAMPLE |
Motor de ejemplo. Consulte Sección 14.5, “El motor de almacenamiento EXAMPLE ”. |
FEDERATED |
Motor que accede a tablas remotas. Consulte
Sección 14.6, “El motor de almacenamiento FEDERATED ”. |
HEAP |
Consulte Sección 14.3, “El motor de almacenamiento MEMORY
(HEAP )”. |
(OBSOLETE) ISAM
|
No disponible en MySQL 5.0. Si está actualizando a MySQL 5.0 desde una
versión prévia, debe convertir cualquier tabla
ISAM existente a
MyISAM antes de
la actualización. Consulte
Capítulo 14, Motores de almacenamiento de MySQL y tipos de tablas. |
InnoDB |
Tablas transaccionales con bloqueo de registro y claves foráneas.
Consulte Capítulo 15, El motor de almacenamiento InnoDB . |
MEMORY |
Los datos de este tipo de tabla se almacenan sólo en memoria. (Conocido
anteriormente como HEAP .) |
MERGE |
Colección de tablas MyISAM usadas como una sola
tabla. También conocido como
MRG_MyISAM . Consulte
Sección 14.2, “El motor de almacenamiento MERGE ”. |
MyISAM |
Motor binario portable que es el motor por defecto usado en MySQL.
Consulte Sección 14.1, “El motor de almacenamiento MyISAM ”. |
NDBCLUSTER |
Clusterizado, tolerante a errores, tablas en memoria. También conocido
como NDB . 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
MyISAM
. Por ejemplo, si una definición de
tabla incluye la opción ENGINE=BDB
pero el
servidor MySQL no soporta tablas BDB
, la
tabla se crea como MyISAM
. 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:
AUTO_INCREMENT
El valor inicial para AUTO_INCREMENT
para
la tabla. En MySQL 5.0, sólo funciona para tablas
MyISAM
y MEMORY
.
También se soporta para InnoDB
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
AUTO_INCREMENT
en comandos
CREATE TABLE
puede usar ALTER
TABLE
para resetear el
valor tbl_name
AUTO_INCREMENT =
n
AUTO_INCREMENT
.
AVG_ROW_LENGTH
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 MyISAM
, MySQL usa
el producto de las opciones MAX_ROWS
y
AVG_ROW_LENGTH
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
myisam_data_pointer_size
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.
[DEFAULT] CHARACTER SET
Especifica el conjunto de caracteres para la tabla.
CHARSET
es un sinónimo.
para CHARACTER SET
.
COLLATE
Especifica la colación por defecto de la tabla.
CHECKSUM
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
CHECKSUM TABLE
muestra el checksum (sólo
para MyISAM
).
COMMENT
Un comentario para su tabla, hasta 60 caracteres.
MAX_ROWS
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.
MIN_ROWS
Mínimo número de registros que planea almacenar en la tabla.
PACK_KEYS
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
DEFAULT
le dice al motor que comprima
sólo columnas
CHAR
/VARCHAR
largas
(MyISAM
y ISAM
sólo).
Si no usa PACK_KEYS
, por defecto se
comprimen sólo cadenas, no números. Si usa
PACK_KEYS=1
, 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
storage_size_for_key + pointer_size
(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
NULL
. (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 NULL
.)
PASSWORD
Encripta el fichero .frm
con una
contraseña. Esta opción no hace nada en la versión
estándar de MySQL.
DELAY_KEY_WRITE
Póngalo a 1 si quiere retardar actualizaciones de clave
para la tabla hasta que la tabla se cierra (sólo en
MyISAM
).
ROW_FORMAT
Define cómo deben almacenarse los registros. Actualmente
esta opción sólo funciona con tablas
MyISAM
. El valor de la opción puede ser
FIXED
o DYNAMIC
para
formato de longitud estática o variable.
myisampack cambia el tipo a
COMPRESSED
. Consulte
Sección 14.1.3, “Formatos de almacenamiento de tablas MyISAM
”.
Desde MySQL/InnoDB-5.0.3, los registros de InnoDB se
almacenan de forma más compacta
(ROW_FORMAT=COMPACT
) por defecto. El
antiguo formato puede usarse espeficicando
ROW_FORMAT=REDUNDANT
.
Tenga en cuenta que el soporte para RAID
se ha eliminado desde MySQL 5.0. Para información sobre
RAID
, consulte Manual de referencia de MySQL 4.1.
UNION
UNION
se usa cuando quiere usar una
colección de tablas idénticas como una. Funciona sólo con
tablas MERGE
. Consulte
Sección 14.2, “El motor de almacenamiento MERGE
”.
En MySQL 5.0, debe tener permisos SELECT
,
UPDATE
, y DELETE
para
las tablas mapeadas en una tabla MERGE
.
(Nota: Originalmente, todas las tablas
usadas tenían que estar en la misma base de datos que la
tabla MERGE
. Esta restricción se ha
eliminado.)
INSERT_METHOD
Si quiere insertar datos en una tabla
MERGE
debe especificarlo con
INSERT_METHOD
en la tabla en que se debe
insertar el registro. INSERT_METHOD
es
una opción útil para tablas MERGE
sólo. Use un valor dee FIRST
o
LAST
para que las inserciones vayan a la
primera o última tabla, o un valor de NO
para evitar inserciones. Consulte
Sección 14.2, “El motor de almacenamiento MERGE
”.
DATA DIRECTORY
, INDEX
DIRECTORY
Usando DATA
DIRECTORY='
o
directory
'INDEX
DIRECTORY='
puede especificar dónde debe el moto
directory
'MyISAM
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
--skip-symbolic-links
. Su sistema
operativo debe tener una llamada
realpath()
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 SELECT
al final del comando
CREATE TABLE
:
CREATE TABLEnew_tbl
SELECT * FROMorig_tbl
;
MySQL crea nuevas columnas para todos los elementos en un
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 crea una tabla MyISAM
con tres columnas,
a
, b
, y
c
. Tenga en cuenta que las columnas para el
comando SELECT
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 foo
, se
inserta un registro en bar
con los valores de
foo
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.
CREATE TABLE ... SELECT
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
SELECT
:
mysql> CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo;
Algunas conversiones de tipos de columnas pueden ocurrir. Por
ejemplo, el atributo AUTO_INCREMENT
no se
preserva, y las columnas VARCHAR
pueden ser
CHAR
.
Al crear una tabla con CREATE ... SELECT
,
asegurése de poner un alias para cualquier llamada a función o
expresión en la consulta. Si no lo hace, el comando
CREATE
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 LIKE
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 TABLEnew_tbl
LIKEorig_tbl
;
CREATE TABLE ... LIKE
no copia ninguna
opción de tabla DATA DIRECTORY
o
INDEX DIRECTORY
especificadas en la tabla
original, ni ninguna definición de clave foránea.
Puede preceder SELECT
con
IGNORE
o REPLACE
para
indicar cómo tratar registros que dupliquen claves únicas. Con
IGNORE
, los nuevos registros que duplican un
registro único existente se descartan. Con
REPLACE
, los nuevos registros reemplazan a
los antiguos con el mismo valor. Si ni IGNORE
ni REPLACE
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 CREATE TABLE ... SELECT
.
É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.