ALTER DATABASE [db_name]
alter_specification [, alter_specification] ...
alter_specification:
[DEFAULT] CHARACTER SET charset_name
| [DEFAULT] COLLATE collation_name
ALTER DATABASE enables you to change the
overall characteristics of a database. These characteristics are stored
in the db.opt file in the database
directory. To use ALTER DATABASE, you need
the ALTER privilege on the database.
The CHARACTER SET clause changes the
default database character set. The COLLATE
clause changes the default database collation.
Chapter 10, Character Set Support, discusses character set
and collation names.
ALTER DATABASE was added in MySQL 4.1.1.
Beginning with MySQL 4.1.8, the database name can be omitted, in which
case the statement applies to the default database.
13.1.2. ALTER TABLE Syntax
ALTER [IGNORE] TABLE tbl_namealter_specification [, alter_specification] ...
alter_specification:
ADD [COLUMN] column_definition [FIRST | AFTER col_name ]
| ADD [COLUMN] (column_definition,...)
| ADD {INDEX|KEY} [index_name] [index_type] (index_col_name,...)
| ADD [CONSTRAINT [symbol]]
PRIMARY KEY [index_type] (index_col_name,...)
| ADD [CONSTRAINT [symbol]]
UNIQUE [INDEX|KEY] [index_name] [index_type] (index_col_name,...)
| ADD [FULLTEXT|SPATIAL] [INDEX|KEY] [index_name] (index_col_name,...)
| ADD [CONSTRAINT [symbol]]
FOREIGN KEY [index_name] (index_col_name,...)
[reference_definition]
| ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
| CHANGE [COLUMN] old_col_namecolumn_definition
[FIRST|AFTER col_name]
| MODIFY [COLUMN] column_definition [FIRST | AFTER col_name]
| DROP [COLUMN] col_name
| DROP PRIMARY KEY
| DROP {INDEX|KEY} index_name
| DROP FOREIGN KEY fk_symbol
| DISABLE KEYS
| ENABLE KEYS
| RENAME [TO] new_tbl_name
| ORDER BY col_name
| CONVERT TO CHARACTER SET charset_name [COLLATE collation_name]
| [DEFAULT] CHARACTER SET charset_name [COLLATE collation_name]
| DISCARD TABLESPACE
| IMPORT TABLESPACE
| table_option ...
ALTER TABLE enables you to change the
structure of an existing table. For example, you can add or delete
columns, create or destroy indexes, change the type of existing columns,
or rename columns or the table itself. You can also change the comment
for the table and type of the table.
The syntax for many of the allowable alterations is similar to clauses
of the CREATE TABLE statement. This
includes table_option
modifications, for options such as ENGINE,
AUTO_INCREMENT, and
AVG_ROW_LENGTH. (However,
ALTER TABLE ignores the DATA DIRECTORY
and INDEX DIRECTORY table options.)
Section 13.1.5, “CREATE TABLE Syntax”,
lists all table options.
Some operations may result in warnings if attempted on a table for which
the storage engine does not support the operation. In MySQL 4.1 and up,
these warnings can be displayed with
SHOW WARNINGS. See
Section 13.5.4.21, “SHOW WARNINGS Syntax”.
If you use ALTER TABLE to change a column
specification but DESCRIBE
tbl_name indicates that
your column was not changed, it is possible that MySQL ignored your
modification for one of the reasons described in
Section 13.1.5.1, “Silent Column Specification Changes”. For
example, if you try to change a VARCHAR
column to
CHAR, MySQL still uses
VARCHAR if the table contains other
variable-length columns.
In most cases, ALTER TABLE works by making
a temporary copy of the original table. The alteration is performed on
the copy, and then the original table is deleted and the new one is
renamed. While ALTER TABLE
is executing, the original table is readable by other clients. Updates
and writes to the table are stalled until the new table is ready, and
then are automatically redirected to the new table without any failed
updates.
If you use ALTER TABLE
tbl_name RENAME TO
new_tbl_name without
any other options, MySQL simply renames any files that correspond to the
table tbl_name. There is no
need to create a temporary table. (You can also use the
RENAME TABLE statement to rename tables.
See
Section 13.1.9, “RENAME TABLE Syntax”.)
If you use any option to ALTER TABLE other
than RENAME, MySQL always creates a
temporary table, even if the data wouldn't strictly need to be copied
(such as when you change the name of a column). For
MyISAM tables, you can speed up the index
re-creation operation (which is the slowest part of the alteration
process) by setting the
myisam_sort_buffer_size system variable to
a high value.
To use ALTER TABLE, you need
ALTER, INSERT,
and
CREATE privileges for the table.
IGNORE is a MySQL extension to standard
SQL. It controls how ALTER TABLE works
if there are duplicates on unique keys in the new table or if
warnings occur when strict mode is enabled. If
IGNORE is not specified, the copy is
aborted and rolled back if duplicate-key errors occur. If
IGNORE is specified, only the first row
is used of rows with duplicates on a unique key, The other
conflicting rows are deleted. Incorrect values are truncated to the
closest matching acceptable value.
You can issue multiple ADD,
ALTER, DROP,
and
CHANGE clauses in a single
ALTER TABLE statement, separated by commas. This is a MySQL
extension to standard SQL, which allows only one of each clause per
ALTER TABLE statement. For example, to drop multiple columns
in a single statement, do this:
ALTER TABLE t2 DROP COLUMN c, DROP COLUMN d;
CHANGE
col_name,
DROP
col_name, and
DROP INDEX are MySQL extensions to
standard SQL.
MODIFY is an Oracle extension to
ALTER TABLE.
The word COLUMN is optional and can be
omitted.
column_definition clauses
use the same syntax for ADD and
CHANGE as for
CREATE TABLE. Note that this syntax includes the column name,
not just its data type. See
Section 13.1.5, “CREATE TABLE Syntax”.
You can rename a column using a CHANGE
old_col_namecolumn_definition
clause. To do so, specify the old and new column names and the type
that the column currently has. For example, to rename an
INTEGER column from
a to b,
you can do this:
ALTER TABLE t1 CHANGE a b INTEGER;
If you want to change a column's type but not the name,
CHANGE syntax still requires an old and
new column name, even if they are the same. For example:
ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;
However, as of MySQL 3.22.16a, you can also use
MODIFY to change a column's type
without renaming it:
ALTER TABLE t1 MODIFY b BIGINT NOT NULL;
If you use CHANGE or
MODIFY to shorten a column for which an
index exists on the column, and the resulting column length is less
than the index length, MySQL shortens the index automatically.
When you change a data type using CHANGE
or MODIFY, MySQL tries to convert
existing column values to the new type as well as possible.
In MySQL 3.22 or later, to add a column at a specific position
within a table row, use FIRST or
AFTER
col_name. The
default is to add the column last. From MySQL 4.0.1 on, you can also
use FIRST and
AFTER in
CHANGE or MODIFY
operations.
ALTER ... SET DEFAULT or
ALTER ... DROP DEFAULT specify a new default value for a
column or remove the old default value, respectively. If the old
default is removed and the column can be
NULL, the new default is
NULL. If the column cannot be
NULL, MySQL assigns a default value, as
described in
Section 11.1.4, “Data Type Default Values”.
If columns are dropped from a table, the columns are also removed
from any index of which they are a part. If all columns that make up
an index are dropped, the index is dropped as well.
If a table contains only one column, the column cannot be dropped.
If what you intend is to remove the table, use
DROP TABLE instead.
DROP PRIMARY KEY drops the primary
index. (Prior to MySQL 4.1.2, if no primary index exists,
DROP PRIMARY KEY drops the first
UNIQUE index in the table. MySQL marks
the first UNIQUE key as the
PRIMARY KEY if no
PRIMARY KEY was specified explicitly.)
If you add a UNIQUE INDEX or
PRIMARY KEY to a table, it is stored
before any non-unique index so that MySQL can detect duplicate keys
as early as possible.
ORDER BY enables you to create the new
table with the rows in a specific order. Note that the table does
not remain in this order after inserts and deletes. This option is
useful primarily when you know that you are mostly to query the rows
in a certain order most of the time. By using this option after
major changes to the table, you might be able to get higher
performance. In some cases, it might make sorting easier for MySQL
if the table is in order by the column that you want to order it by
later.
If you use ALTER TABLE on a
MyISAM table, all non-unique indexes
are created in a separate batch (as for REPAIR
TABLE). This should make ALTER TABLE
much faster when you have many indexes.
As of MySQL 4.0, this feature can be activated explicitly.
ALTER TABLE ... DISABLE KEYS tells
MySQL to stop updating non-unique indexes for a
MyISAM table.
ALTER TABLE ... ENABLE KEYS then should be used to re-create
missing indexes. MySQL does this with a special algorithm that is
much faster than inserting keys one by one, so disabling keys before
performing bulk insert operations should give a considerable
speedup. Using ALTER TABLE ... DISABLE KEYS
requires the
INDEX privilege in addition to the
privileges mentioned earlier.
The FOREIGN KEY and
REFERENCES clauses are supported by the
InnoDB storage engine, which implements
ADD [CONSTRAINT [symbol]]
FOREIGN KEY (...) REFERENCES ... (...). See
Section 14.2.7.4, “FOREIGN KEY
Constraints”. For other storage engines, the clauses are parsed
but ignored. The
CHECK clause is parsed but ignored by
all storage engines. See
Section 13.1.5, “CREATE TABLE Syntax”.
The reason for accepting but ignoring syntax clauses is for
compatibility, to make it easier to port code from other SQL
servers, and to run applications that create tables with references.
See
Section 1.9.5, “MySQL Differences from Standard SQL”.
You cannot add a foreign key and drop a foreign key in separate
clauses of a single ALTER TABLE
statement. You must use separate statements.
Starting from MySQL 4.0.13, InnoDB
supports the use of ALTER TABLE to drop
foreign keys:
ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;
You cannot add a foreign key and drop a foreign key in separate
clauses of a single ALTER TABLE
statement. You must use separate statements.
From MySQL 4.1.2 on, if you want to change the table default
character set and all character columns (CHAR,
VARCHAR,
TEXT) to a new character set, use a
statement like this:
ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;
Warning: The preceding
operation converts column values between the character sets. This is
not what you want if you have a column in one character
set (like latin1) but the stored values
actually use some other, incompatible character set (like
utf8). In this case, you have to do the following for each
such column:
ALTER TABLE t1 CHANGE c1 c1 BLOB;
ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8;
The reason this works is that there is no conversion when you
convert to or from BLOB columns.
If you specify CONVERT TO CHARACTER SET binary,
the CHAR,
VARCHAR, and TEXT
columns are converted to their corresponding binary string types (BINARY,
VARBINARY, BLOB).
This means that the columns no longer will have a character set and
a subsequent CONVERT TO operation will
not apply to them.
To change only the default
character set for a table, use this statement:
ALTER TABLE tbl_name DEFAULT CHARACTER SET charset_name;
The word DEFAULT is optional. The
default character set is the character set that is used if you do
not specify the character set for a new column which you add to a
table (for example, with ALTER TABLE ... ADD
column).
Warning: From MySQL 4.1.2
and up, ALTER TABLE ... DEFAULT CHARACTER SET
and ALTER TABLE ... CHARACTER SET are
equivalent and change only the default table character set. In MySQL
4.1 releases before 4.1.2,
ALTER TABLE ... DEFAULT CHARACTER SET
changes the default character set, but ALTER
TABLE ... CHARACTER SET (without
DEFAULT) changes the default character
set and also converts all columns to the
new character set.
For an InnoDB table that is created
with its own tablespace in an .ibd
file, that file can be discarded and imported. To discard the
.ibd file, use this statement:
ALTER TABLE tbl_name DISCARD TABLESPACE;
This deletes the current .ibd file, so
be sure that you have a backup first. Attempting to access the table
while the tablespace file is discarded results in an error.
To import the backup .ibd file back
into the table, copy it into the database directory, and then issue
this statement:
With the mysql_info() C API function, you
can find out how many rows were copied, and (when
IGNORE is used) how many rows were deleted
due to duplication of unique key values. See
Section 17.2.3.33, “mysql_info()”.
Here are some examples that show uses of ALTER
TABLE. Begin with a table t1 that is
created as shown here:
CREATE TABLE t1 (a INTEGER,b CHAR(10));
To rename the table from t1 to
t2:
ALTER TABLE t1 RENAME t2;
To change column a from
INTEGER to TINYINT
NOT NULL (leaving the name the same), and to change column
b from CHAR(10)
to
CHAR(20) as well as renaming it from
b to c:
ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);
To add a new TIMESTAMP column named
d:
ALTER TABLE t2 ADD d TIMESTAMP;
To add indexes on column d and on column
a:
ALTER TABLE t2 ADD INDEX (d), ADD INDEX (a);
To remove column c:
ALTER TABLE t2 DROP COLUMN c;
To add a new AUTO_INCREMENT integer column
named c:
ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY (c);
Note that we indexed c (as a
PRIMARY KEY), because AUTO_INCREMENT
columns must be indexed, and also that we declare
c as NOT NULL,
because primary key columns cannot be NULL.
When you add an AUTO_INCREMENT column,
column values are filled in with sequence numbers for you automatically.
For MyISAM tables, you can set the first
sequence number by executing SET INSERT_ID=value
before
ALTER TABLE or by using the
AUTO_INCREMENT=value
table option. See
Section 13.5.3, “SET Syntax”.
From MySQL 4.1.2, you can use the ALTER TABLE ...
AUTO_INCREMENT=value
table option for InnoDB tables to set the
sequence number for new rows if the value is greater than the maximum
value in the AUTO_INCREMENT column.
If the value is less than the current maximum
value in the column, no error message is given and the current sequence
value is not changed.
With MyISAM tables, if you do not change
the
AUTO_INCREMENT column, the sequence number
is not affected. If you drop an AUTO_INCREMENT
column and then add another AUTO_INCREMENT
column, the numbers are resequenced beginning with 1.
When replication is used, adding an
AUTO_INCREMENT column to a table might not
produce the same ordering of the rows on the slave and the master. This
occurs because the order in which the rows are numbered depends on the
specific storage engine used for the table and the order in which the
rows were inserted. If it is important to have the same order on the
master and slave, the rows must be ordered before assigning an
AUTO_INCREMENT number. Assuming that you
want to add an AUTO_INCREMENT column to the
table
t1, the following statements produce a new
table t2 identical to
t1
but with an AUTO_INCREMENT column:
CREATE TABLE t2 (id INT AUTO_INCREMENT PRIMARY KEY)
SELECT * FROM t1 ORDER BY col1, col2;
This assumes that the table t1 has columns
col1 and col2.
This set of statements will also produce a new table
t2 identical to t1,
with the addition of an AUTO_INCREMENT
column:
CREATE TABLE t2 LIKE t1;
ALTER TABLE T2 ADD id INT AUTO_INCREMENT PRIMARY KEY;
INSERT INTO t2 SELECT * FROM t1 ORDER BY col1, col2;
Important: To guarantee the
same ordering on both master and slave, all
columns of t1 must be referenced in the
ORDER BY clause.
Regardless of the method used to create and populate the copy having the
AUTO_INCREMENT column, the final step is to drop the original
table and then rename the copy:
CREATE DATABASE [IF NOT EXISTS] db_name
[create_specification [, create_specification] ...]
create_specification:
[DEFAULT] CHARACTER SET charset_name
| [DEFAULT] COLLATE collation_name
CREATE DATABASE creates a database with the
given name. To use this statement, you need the
CREATE privilege for the database.
An error occurs if the database exists and you did not specify
IF NOT EXISTS.
As of MySQL 4.1.1,
create_specification options
specify database characteristics. Database characteristics are stored in
the db.opt file in the database directory.
The CHARACTER SET clause specifies the
default database character set. The COLLATE
clause specifies the default database collation.
Chapter 10, Character Set Support, discusses character set
and collation names.
A database in MySQL is implemented as a directory containing files that
correspond to tables in the database. Because there are no tables in a
database when it is initially created, the
CREATE DATABASE statement only creates a
directory under the MySQL data directory (and the
db.opt file, for MySQL 4.1.1 and up).
Rules for allowable database names are given in
Section 9.2, “Database, Table, Index, Column, and Alias Names”.
If you manually create a directory under the data directory (for
example, with mkdir), the
server considers it a database directory and it shows up in the output
of
SHOW DATABASES.
Normally, you create all indexes on a table at the time the table itself
is created with CREATE TABLE. See
Section 13.1.5, “CREATE TABLE Syntax”.
CREATE INDEX enables you to add indexes to existing tables.
A column list of the form (col1,col2,...)
creates a multiple-column index. Index values are formed by
concatenating the values of the given columns.
For CHAR, VARCHAR,
BINARY, and VARBINARY
columns, indexes can be created that use only the leading part of column
values, using
col_name(length)
syntax to specify an index prefix length.
BLOB and TEXT
columns also can be indexed, but a prefix length
must be given. Prefix lengths are given in characters for
non-binary string types and in bytes for binary string types. That is,
index entries consist of the first
length characters of each
column value for CHAR,
VARCHAR, and TEXT columns, and the
first
length bytes of each column
value for
BINARY, VARBINARY,
and
BLOB columns.
The statement shown here creates an index using the first 10 characters
of the name column:
CREATE INDEX part_of_name ON customer (name(10));
If names in the column usually differ in the first 10 characters, this
index should not be much slower than an index created from the entire
name column. Also, using partial columns for indexes can make the
index file much smaller, which could save a lot of disk space and might
also speed up INSERT operations.
Prefixes can be up to 1000 bytes long (767 bytes for
InnoDB tables). (Before MySQL 4.1.2, the
limit is 255 bytes for all tables.) Note that prefix limits are measured
in bytes, whereas the prefix length in CREATE
INDEX statements is interpreted as number of characters for
non-binary data types (CHAR,
VARCHAR, TEXT).
Take this into account when specifying a prefix length for a column that
uses a multi-byte character set.
A UNIQUE index creates a constraint such
that all values in the index must be distinct. An error occurs if you
try to add a new row with a key value that matches an existing row. This
constraint does not apply to NULL
values except for the BDB storage engine.
For other engines, a UNIQUE index allows
multiple
NULL values for columns that can contain
NULL.
FULLTEXT indexes are supported only for
MyISAM tables and can include only
CHAR, VARCHAR,
and
TEXT columns. Indexing always happens over
the entire column; partial indexing is not supported and any prefix
length is ignored if specified. See
Section 12.7, “Full-Text Search Functions”, for details of
operation.
FULLTEXT indexes are available in MySQL
3.23.23 or later.
SPATIAL indexes are supported only for
MyISAM tables and can include only spatial
columns that are defined as NOT NULL.
SPATIAL indexes are available in MySQL 4.1
or later.
Chapter 16, Spatial Extensions, describes the spatial data
types.
You can add an index on a column that can have
NULL values only if you are using MySQL
3.23.2 or newer and are using the MyISAM,
InnoDB, or BDB
storage engine. This is also true for MEMORY
tables as of MySQL 4.0.2. You can only add an index on a
BLOB or TEXT
column if you are using MySQL 3.23.2 or newer and are using the
MyISAM or BDB
storage engine, or MySQL 4.0.14 or newer and the
InnoDB storage engine.
An index_col_name
specification can end with ASC or
DESC. These keywords are allowed for future extensions for
specifying ascending or descending index value storage. Currently, they
are parsed but ignored; index values are always stored in ascending
order.
From MySQL 4.1.0 on, some storage engines allow you to specify an index
type when creating an index. The allowable index type values supported
by different storage engines are shown in the following table. Where
multiple index types are listed, the first one is the default when no
index type specifier is given.
Storage Engine
Allowable Index Types
MyISAM
BTREE
InnoDB
BTREE
MEMORY/HEAP
HASH, BTREE
If you specify an index type that is not legal for a given storage
engine, but there is another index type available that the engine can
use without affecting query results, the engine uses the available type.
Examples:
CREATE TABLE lookup (id INT) ENGINE = MEMORY;
CREATE INDEX id_index USING BTREE ON lookup (id);
TYPE type_name
is recognized as a synonym for USING
type_name. However,
USING is the preferred form.
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name
{ LIKE old_tbl_name | (LIKE old_tbl_name) }
create_definition:
column_definition
| [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...)
| {INDEX|KEY} [index_name] [index_type] (index_col_name,...)
| [CONSTRAINT [symbol]] UNIQUE [INDEX|KEY]
[index_name] [index_type] (index_col_name,...)
| {FULLTEXT|SPATIAL} [INDEX|KEY] [index_name] (index_col_name,...)
| [CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name,...) [reference_definition]
| CHECK (expr)
column_definition:
col_namedata_type [NOT NULL | NULL] [DEFAULT default_value]
[AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY]
[COMMENT 'string'] [reference_definition]
data_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
| YEAR
| CHAR(length)
[CHARACTER SET charset_name] [COLLATE collation_name]
| VARCHAR(length)
[CHARACTER SET charset_name] [COLLATE collation_name]
| BINARY(length)
| VARBINARY(length)
| TINYBLOB
| BLOB
| MEDIUMBLOB
| LONGBLOB
| TINYTEXT [BINARY]
[CHARACTER SET charset_name] [COLLATE collation_name]
| TEXT [BINARY]
[CHARACTER SET charset_name] [COLLATE collation_name]
| MEDIUMTEXT [BINARY]
[CHARACTER SET charset_name] [COLLATE collation_name]
| LONGTEXT [BINARY]
[CHARACTER SET charset_name] [COLLATE collation_name]
| ENUM(value1,value2,value3,...)
[CHARACTER SET charset_name] [COLLATE collation_name]
| SET(value1,value2,value3,...)
[CHARACTER SET charset_name] [COLLATE collation_name]
| spatial_typeindex_col_name:
col_name [(length)] [ASC | DESC]
index_type:
USING {BTREE | HASH}
reference_definition:
REFERENCES tbl_name [(index_col_name,...)]
[MATCH FULL | MATCH PARTIAL | MATCH SIMPLE]
[ON DELETE reference_option]
[ON UPDATE reference_option]
reference_option:
RESTRICT | CASCADE | SET NULL | NO ACTION
table_option:
{ENGINE|TYPE} = engine_name
| AUTO_INCREMENT = value
| AVG_ROW_LENGTH = value
| [DEFAULT] CHARACTER SET charset_name
| CHECKSUM = {0 | 1}
| COLLATE collation_name
| COMMENT = 'string'
| DATA DIRECTORY = 'absolute path to directory'
| DELAY_KEY_WRITE = {0 | 1}
| INDEX DIRECTORY = 'absolute path to directory'
| INSERT_METHOD = { NO | FIRST | LAST }
| MAX_ROWS = value
| MIN_ROWS = value
| PACK_KEYS = {0 | 1 | DEFAULT}
| PASSWORD = 'string'
| RAID_TYPE = { 1 | STRIPED | RAID0 }
RAID_CHUNKS = value
RAID_CHUNKSIZE = value
| ROW_FORMAT = {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
| UNION = (tbl_name[,tbl_name]...)
select_statement:
[IGNORE | REPLACE] [AS] SELECT ... (Some legal select statement)
CREATE TABLE creates a table with the given
name. You must have the CREATE privilege
for the table.
Rules for allowable table names are given in
Section 9.2, “Database, Table, Index, Column, and Alias Names”. By
default, the table is created in the default database. An error occurs
if the table exists, if there is no default database, or if the database
does not exist.
In MySQL 3.22 or later, the table name can be specified as
db_name.tbl_name to create the
table in a specific database. This works regardless of whether there is
a default database, assuming that the database exists. If you use quoted
identifiers, quote the database and table names separately. For example,
write
`mydb`.`mytbl`, not
`mydb.mytbl`.
From MySQL 3.23 on, you can use the TEMPORARY
keyword when creating a table. A TEMPORARY
table is visible only to the current connection, and is dropped
automatically when the connection is closed. This means that two
different connections can use the same temporary table name without
conflicting with each other or with an existing non-TEMPORARY
table of the same name. (The existing table is hidden until the
temporary table is dropped.) From MySQL 4.0.2 on, to create temporary
tables, you must have the CREATE TEMPORARY TABLES
privilege.
In MySQL 3.23 or later, the keywords IF NOT EXISTS
prevent an error from occurring if the table exists. However, there is
no verification that the existing table has a structure identical to
that indicated by the
CREATE TABLE statement.
Note: If you use
IF NOT EXISTS in a CREATE TABLE ... SELECT
statement, any rows selected by the SELECT
part are inserted regardless of whether the table already exists.
MySQL represents each table by an .frm
table format (definition) file in the database directory. The storage
engine for the table might create other files as well. In the case of
MyISAM tables, the storage engine creates data and index files.
Thus, for each
MyISAM table
tbl_name, there are three disk
files:
data_type represents the data
type is a column definition. spatial_type
represents a spatial data type. For general information on the
properties of data types other than the spatial types, see
Chapter 11,
Data Types. For information about spatial data types, see
Chapter 16, Spatial Extensions.
Some attributes do not apply to all data types.
AUTO_INCREMENT applies only to integer
types.
DEFAULT does not apply to the
BLOB or TEXT
types.
If neither NULL nor
NOT NULL is specified, the column is treated as though
NULL had been specified.
An integer column can have the additional attribute
AUTO_INCREMENT. When you insert a value
of NULL (recommended) or
0 into an indexed
AUTO_INCREMENT column, the column is
set to the next sequence value. Typically this is
value+1,
where
value is the largest value
for the column currently in the table.
AUTO_INCREMENT sequences begin with
1.
As of MySQL 4.1.1, if the
NO_AUTO_VALUE_ON_ZERO SQL mode is
enabled, you can store 0 in
AUTO_INCREMENT columns as
0 without generating a new sequence
value. See
Section 5.2.5, “The Server SQL Mode”.
Note: There can be only
one
AUTO_INCREMENT column per table, it
must be indexed, and it cannot have a DEFAULT
value. As of MySQL 3.23, an
AUTO_INCREMENT column works properly
only if it contains only positive values. Inserting a negative
number is regarded as inserting a very large positive number. This
is done to avoid precision problems when numbers “wrap”
over from positive to negative and also to ensure that you do not
accidentally get an
AUTO_INCREMENT column that contains
0.
From MySQL 4.1.0 on, the attribute SERIAL
is an alias for BIGINT UNSIGNED NOT NULL
AUTO_INCREMENT UNIQUE.
As of MySQL 4.1, character data types (CHAR,
VARCHAR,
TEXT) can include
CHARACTER SET and COLLATE
attributes to specify the character set and collation for the
column. For details, see
Chapter 10, Character Set Support.
CHARSET is a synonym for
CHARACTER SET. Example:
CREATE TABLE t (c CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin);
Also as of 4.1, MySQL interprets length specifications in character
column definitions in characters. (Earlier versions interpret them
in bytes.) Lengths for
BINARY and
VARBINARY
are in bytes.
NULL values are handled differently for
TIMESTAMP columns than for other column
types. Before MySQL 4.1.6, you cannot store a literal
NULL in a
TIMESTAMP
column; setting the column to NULL sets
it to the current date and time. Because
TIMESTAMP columns behave this way, the
NULL and NOT NULL
attributes do not apply in the normal way and are ignored if you
specify them. On the other hand, to make it easier for MySQL clients
to use TIMESTAMP columns, the server
reports that such columns can be assigned
NULL values (which is true), even
though
TIMESTAMP never actually contains a
NULL value. You can see this when you
use
DESCRIBE
tbl_name to get a
description of your table.
Note that setting a TIMESTAMP column to
0 is not the same as setting it to
NULL, because 0
is a valid TIMESTAMP value.
The DEFAULT clause specifies a default
value for a column. With one exception, the default value must be a
constant; it cannot be a function or an expression. This means, for
example, that you cannot set the default for a date column to be the
value of a function such as NOW() or
CURRENT_DATE. The exception is that you
can specify CURRENT_TIMESTAMP as the
default for a TIMESTAMP column as of
MySQL 4.1.2. See
Section 11.3.1.2, “TIMESTAMP Properties
as of MySQL 4.1”.
BLOB and TEXT
columns cannot be assigned a default value.
A comment for a column can be specified with the
COMMENT option. The comment is
displayed by the SHOW CREATE TABLE and
SHOW FULL COLUMNS statements. This
option is operational as of MySQL 4.1. (It is allowed but ignored in
earlier versions.)
KEY is normally a synonym for
INDEX. From MySQL 4.1, the key
attribute
PRIMARY KEY can also be specified as
just
KEY when given in a column definition.
This was implemented for compatibility with other database systems.
A UNIQUE index creates a constraint
such that all values in the index must be distinct. An error occurs
if you try to add a new row with a key value that matches an
existing row. This constraint does not apply to
NULL values except for the
BDB storage engine. For other engines,
a
UNIQUE index allows multiple
NULL values for columns that can
contain
NULL.
A PRIMARY KEY is a unique index where
all key columns must be defined as NOT NULL.
If they are not explicitly declared as NOT
NULL, MySQL declares them so implicitly (and silently). A
table can have only one PRIMARY KEY. If
you do not have a PRIMARY KEY and an
application asks for the
PRIMARY KEY in your tables, MySQL
returns the first UNIQUE index that has
no
NULL columns as the
PRIMARY KEY.
In the created table, a PRIMARY KEY is
placed first, followed by all UNIQUE
indexes, and then the non-unique indexes. This helps the MySQL
optimizer to prioritize which index to use and also more quickly to
detect duplicated UNIQUE
keys.
A PRIMARY KEY can be a multiple-column
index. However, you cannot create a multiple-column index using the
PRIMARY KEY key attribute in a column specification. Doing so
only marks that single column as primary. You must use a separate
PRIMARY KEY(index_col_name,
...) clause.
If a PRIMARY KEY or
UNIQUE index consists of only one
column that has an integer type, you can also refer to the column as
_rowid in SELECT
statements (new in MySQL 3.23.11).
In MySQL, the name of a PRIMARY KEY is
PRIMARY. For other indexes, if you do
not assign a name, the index is assigned the same name as the first
indexed column, with an optional suffix (_2,
_3,
...) to make it unique. You can see
index names for a table using SHOW INDEX FROM
tbl_name. See
Section 13.5.4.11, “SHOW INDEX Syntax”.
From MySQL 4.1.0 on, some storage engines allow you to specify an
index type when creating an index. The syntax for the
index_type specifier is
USING
type_name.
Example:
CREATE TABLE lookup
(id INT, INDEX USING BTREE (id))
ENGINE = MEMORY;
Only the MyISAM,
InnoDB, BDB,
and (as of MySQL 4.0.2) MEMORY storage
engines support indexes on columns that can have
NULL values. In other cases, you must
declare indexed columns as NOT NULL or
an error results.
For CHAR, VARCHAR,
BINARY, and
VARBINARY
columns, indexes can be created that use only the leading part of
column values, using
col_name(length)
syntax to specify an index prefix length.
BLOB and TEXT
columns also can be indexed, but a prefix length
must be given. Prefix lengths
are given in characters for non-binary string types and in bytes for
binary string types. That is, index entries consist of the first
length characters of each column value for
CHAR,
VARCHAR, and TEXT
columns, and the first length
bytes of each column value for BINARY,
VARBINARY, and
BLOB
columns. Indexing only a prefix of column values like this can make
the index file much smaller. See
Section 7.4.3, “Column Indexes”.
Only the MyISAM and (as of MySQL
4.0.14)
InnoDB storage engines support indexing
on BLOB and TEXT
columns. For example:
CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));
Prefixes can be up to 1000 bytes long (767 bytes for
InnoDB tables). (Before MySQL 4.1.2,
the limit is 255 bytes for all tables.) Note that prefix limits are
measured in bytes, whereas the prefix length in
CREATE TABLE statements is interpreted
as number of characters for non-binary data types (CHAR,
VARCHAR,
TEXT). Take this into account when
specifying a prefix length for a column that uses a multi-byte
character set.
An index_col_name
specification can end with ASC or
DESC. These keywords are allowed for
future extensions for specifying ascending or descending index value
storage. Currently, they are parsed but ignored; index values are
always stored in ascending order.
When you use ORDER BY or
GROUP BY on a TEXT or
BLOB column in a
SELECT, the server sorts values using
only the initial number of bytes indicated by the
max_sort_length system variable. See
Section 11.4.3, “The BLOB and
TEXT Types”.
In MySQL 3.23.23 or later, you can create special
FULLTEXT indexes, which are used for
full-text searches. Only the MyISAM
table type supports FULLTEXT indexes.
They can be created only from CHAR,
VARCHAR, and TEXT
columns. Indexing always happens over the entire column; partial
indexing is not supported and any prefix length is ignored if
specified. See
Section 12.7, “Full-Text Search Functions”, for details of
operation.
In MySQL 4.1 or later, you can create
SPATIAL indexes on spatial data types.
Spatial types are supported only for
MyISAM tables and indexed columns must
be declared as NOT NULL. See
Chapter 16, Spatial Extensions.
In MySQL 3.23.44 or later, InnoDB
tables support checking of foreign key constraints. See
Section 14.2, “The InnoDB Storage
Engine”. Note that the FOREIGN KEY
syntax in InnoDB is more restrictive
than the syntax presented for the
CREATE TABLE statement at the beginning
of this section: The columns of the referenced table must always be
explicitly named. InnoDB
supports both ON DELETE and
ON UPDATE actions on foreign keys as of MySQL 3.23.50 and
4.0.8, respectively. For the precise syntax, see
Section 14.2.7.4, “FOREIGN KEY
Constraints”.
For other storage engines, MySQL Server parses and ignores the
FOREIGN KEY and
REFERENCES syntax in
CREATE TABLE statements. The CHECK
clause is parsed but ignored by all storage engines. See
Section 1.9.5.5, “Foreign Keys”.
For MyISAM and
ISAM
tables, each NULL column takes one bit
extra, rounded up to the nearest byte. The maximum row length in
bytes can be calculated as follows:
row length = 1
+ (sum of column lengths)
+ (number of NULL columns + delete_flag + 7)/8
+ (number of variable-length columns)
delete_flag is 1 for
tables with static row format. Static tables use a bit in the row
record for a flag that indicates whether the row has been deleted.
delete_flag is 0 for
dynamic tables because the flag is stored in the dynamic row header.
These calculations do not apply for
InnoDB tables, for which storage size
is no different for NULL columns than
for
NOT NULL columns.
The table_option part of the
CREATE TABLE syntax can be used in MySQL
3.23 and above. The = that separates an
option name and its value is optional as of MySQL 4.1.
The ENGINE and TYPE
options specify the storage engine for the table.
ENGINE was added in MySQL 4.0.18 (for 4.0)
and 4.1.2 (for 4.1). It is the preferred option name as of those
versions, and TYPE has become deprecated.
TYPE is supported throughout the 4.x
series, but likely will be removed in the future.
The ENGINE and TYPE
table options take the storage engine names shown in the following
table.
If a storage engine is specified that is not available, MySQL uses the
default engine instead. Normally, this is
MyISAM. For example, if a table definition
includes the ENGINE=BDB option but the
MySQL server does not support BDB tables,
the table is created as a MyISAM table.
This makes it possible to have a replication setup where you have
transactional tables on the master but tables created on the slave are
non-transactional (to get more speed). In MySQL 4.1.1, a warning occurs
if the storage engine specification is not honored.
The other table options are used to optimize the behavior of the table.
In most cases, you do not have to specify any of them. These options
apply to all storage engines unless otherwise indicated. Options that do
not apply to a given storage engine may be accepted and remembered as
part of the table definition. Such options then apply if you later use
ALTER TABLE to convert the table to use a different storage
engine.
AUTO_INCREMENT
The initial AUTO_INCREMENT value for
the table. This works for MyISAM only,
for
MEMORY as of MySQL 4.1.0, and for
InnoDB as of MySQL 4.1.2. To set the
first auto-increment value for engines that do not support the
AUTO_INCREMENT table option, insert a “dummy”
row with a value one less than the desired value after creating the
table, and then delete the dummy row.
For engines that support the
AUTO_INCREMENT table option in
CREATE TABLE statements, you can also
use
ALTER TABLE
tbl_name
AUTO_INCREMENT = N
to reset the AUTO_INCREMENT value.
AVG_ROW_LENGTH
An approximation of the average row length for your table. You need
to set this only for large tables with variable-size rows.
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 is. If you do not specify either option, the
maximum size for a table is 4GB. (If your operating system does not
support files that large, table sizes are constrained by the
operating system limit.) If you want to keep down the pointer sizes
to make the index smaller and faster and you do not really need big
files, you can decrease the default pointer size by setting the
myisam_data_pointer_size system
variable, which was added in MySQL 4.1.2. (See
Section 5.2.2, “Server System Variables”.) If you want all your
tables to be able to grow above the default limit and are willing to
have your tables slightly slower and larger than necessary, you may
increase the default pointer size by setting this variable.
[DEFAULT] CHARACTER SET
Specify a default character set for the table.
CHARSET is a synonym for
CHARACTER SET.
CHECKSUM
Set this to 1 if you want MySQL to maintain a live checksum for all
rows (that is, a checksum that MySQL updates automatically as the
table changes). This makes the table a little slower to update, but
also makes it easier to find corrupted tables. The
CHECKSUM TABLE
statement reports the checksum. (MyISAM
only.)
COLLATE
Specify a default collation for the table.
COMMENT
A comment for the table, up to 60 characters long.
DATA DIRECTORY,
INDEX DIRECTORY
By using DATA DIRECTORY='directory'
or INDEX DIRECTORY='directory'
you can specify where the MyISAM
storage engine should put a table's data file and index file. The
directory must be the full pathname to the directory, not a relative
path.
These options work only for MyISAM
tables from MySQL 4.0 on, when you are not using the
--skip-symbolic-links option. Your
operating system must also have a working, thread-safe
realpath() call. See
Section 7.6.1.2, “Using Symbolic Links for Tables on Unix”, for
more complete information.
DELAY_KEY_WRITE
Set this to 1 if you want to delay key updates for the table until
the table is closed. See the description of the
delay_key_write system variable in
Section 5.2.2, “Server System Variables”. (MyISAM
only.)
INSERT_METHOD
If you want to insert data into a MERGE
table, you must specify with
INSERT_METHOD the table into which the
row should be inserted. INSERT_METHOD
is an option useful for MERGE tables
only. Use a value of FIRST or
LAST to have inserts go to the first or
last table, or a value of NO to prevent
inserts. This option was introduced in MySQL 4.0.0. See
Section 14.3, “The MERGE Storage
Engine”.
MAX_ROWS
The maximum number of rows you plan to store in the table. This is
not a hard limit, but rather a hint to the storage engine that the
table must be able to store at least this many rows.
MIN_ROWS
The minimum number of rows you plan to store in the table.
PACK_KEYS
PACK_KEYS takes effect only with
MyISAM tables. Set this option to 1 if
you want to have smaller indexes. This usually makes updates slower
and reads faster. Setting the option to 0 disables all packing of
keys. Setting it to
DEFAULT tells the storage engine to
pack only long CHAR or
VARCHAR columns.
If you do not use PACK_KEYS, the
default is to pack only strings, but not numbers. If you use
PACK_KEYS=1, numbers are packed as
well.
When packing binary number keys, MySQL uses prefix compression:
Every key needs one extra byte to indicate how many bytes of the
previous key are the same for the next key.
The pointer to the row is stored in high-byte-first order
directly after the key, to improve compression.
This means that if you have many equal keys on two consecutive rows,
all following “same” keys usually only
take two bytes (including the pointer to the row). Compare this to
the ordinary case where the following keys takes
storage_size_for_key + pointer_size (where the pointer size
is usually 4). Conversely, you get a significant benefit from prefix
compression only if you have many numbers that are the same. If all
keys are totally different, you use one byte more per key, if the
key is not a key that can have
NULL values. (In this case, the packed
key length is stored in the same byte that is used to mark if a key
is NULL.)
PASSWORD
Encrypt the .frm file with a password.
This option does nothing in the standard MySQL version.
RAID_TYPE
The RAID_TYPE option can help you to
exceed the 2GB/4GB limit for the MyISAM
data file (not the index file) on operating systems that do not
support big files. This option is unnecessary and not recommended
for filesystems that support big files.
You can get more speed from the I/O bottleneck by putting
RAID directories on different physical
disks. The only allowed RAID_TYPE is
STRIPED. 1
and
RAID0 are aliases for
STRIPED.
If you specify the RAID_TYPE option for
a
MyISAM table, specify the
RAID_CHUNKS and
RAID_CHUNKSIZE options as well. The
maximum RAID_CHUNKS value is 255.
MyISAM creates
RAID_CHUNKS subdirectories named
00, 01,
02, ... 09,
0a, 0b,
... in the database directory. In each of these directories,
MyISAM creates a file
tbl_name.MYD.
When writing data to the data file, the
RAID handler maps the first
RAID_CHUNKSIZE*1024 bytes to the first
file, the next RAID_CHUNKSIZE*1024
bytes to the next file, and so on.
RAID_TYPE works on any operating
system, as long as you have built MySQL with the
--with-raid option to
configure. To
determine whether a server supports RAID
tables, use SHOW VARIABLES LIKE 'have_raid'
to see whether the variable value is YES.
ROW_FORMAT
Defines how the rows should be stored. Currently, this option works
only with MyISAM tables. The option
value can be FIXED or
DYNAMIC for static or variable-length
row format. myisampack
sets the type to
COMPRESSED. See
Section 14.1.3, “MyISAM Table Storage
Formats”.
UNION
UNION is used when you want to access a
collection of identical MyISAM tables
as one. This works only with MERGE
tables. See
Section 14.3, “The MERGE Storage
Engine”.
In MySQL 4.1, you must have
SELECT, UPDATE,
and
DELETE privileges for the tables you
map to a MERGE table. (Note:
Originally, all tables used had to be in the same database as the
MERGE
table itself. This restriction has been lifted as of MySQL 4.1.1.
As of MySQL 3.23, you can create one table from another by adding a
SELECT statement at the end of the
CREATE TABLE statement:
CREATE TABLE new_tbl SELECT * FROM orig_tbl;
MySQL creates new columns for all elements in the
SELECT. For example:
mysql> CREATE TABLE test (a INT NOT NULL AUTO_INCREMENT,
-> PRIMARY KEY (a), KEY(b))
-> TYPE=MyISAM SELECT b,c FROM test2;
This creates a MyISAM table with three
columns, a, b,
and
c. Notice that the columns from the
SELECT statement are appended to the right
side of the table, not overlapped onto it. Take the following example:
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)
For each row in table foo, a row is
inserted in bar with the values from
foo and default values for the new columns.
In a table resulting from CREATE TABLE ... SELECT,
columns named only in the CREATE TABLE part
come first. Columns named in both parts or only in the
SELECT part come after that. The data type of
SELECT columns can be overridden by also specifying the column in
the CREATE TABLE part.
If any errors occur while copying the data to the table, it is
automatically dropped and not created.
CREATE TABLE ... SELECT does not
automatically create any indexes for you. This is done intentionally to
make the statement as flexible as possible. If you want to have indexes
in the created table, you should specify these before the
SELECT statement:
mysql> CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo;
Some conversion of data types might occur. For example, the
AUTO_INCREMENT attribute is not preserved,
and VARCHAR columns can become
CHAR columns.
When creating a table with CREATE ... SELECT,
make sure to alias any function calls or expressions in the query. If
you do not, the CREATE statement might fail
or result in undesirable column names.
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;
As of MySQL 4.1, you can explicitly specify the data type for a
generated column:
CREATE TABLE foo (a TINYINT NOT NULL) SELECT b+1 AS a FROM bar;
In MySQL 4.1, you can also use LIKE to
create an empty table based on the definition of another table,
including any column attributes and indexes the original table has:
CREATE TABLE new_tbl LIKE orig_tbl;
CREATE TABLE ... LIKE does not preserve any
DATA DIRECTORY or
INDEX DIRECTORY table options that were specified for the
original table, or any foreign key definitions.
You can precede the SELECT by
IGNORE or REPLACE
to indicate how to handle rows that duplicate unique key values. With
IGNORE, new rows that duplicate an existing row on a unique key
value are discarded. With
REPLACE, new rows replace rows that have
the same unique key value. If neither IGNORE
nor
REPLACE is specified, duplicate unique key
values result in an error.
To ensure that the update log or binary log can be used to re-create the
original tables, MySQL does not allow concurrent inserts for
CREATE TABLE ... SELECT
statements.
13.1.5.1. Silent Column Specification Changes
In some cases, MySQL silently changes column specifications from those
given in a CREATE TABLE or
ALTER TABLE statement. These might be
changes to a data type, to attributes associated with a data type,
or to an index specification.
VARCHAR columns with a length less
than four are changed to CHAR.
If any column in a table has a variable length, the entire row
becomes variable-length as a result. Therefore, if a table
contains any variable-length columns (VARCHAR,
TEXT, or
BLOB), all CHAR
columns longer than three characters are changed to
VARCHAR columns. This does not affect
how you use the columns in any way; in MySQL,
VARCHAR is just a different way to
store characters. MySQL performs this conversion because it
saves space and makes table operations faster. See
Chapter 14, Storage Engines and Table Types.
From MySQL 4.1.0 onward, a CHAR or
VARCHAR column with a length
specification greater than 255 is converted to the smallest
TEXT type that can hold values of the given length. For
example,
VARCHAR(500) is converted to
TEXT, and
VARCHAR(200000) is converted to
MEDIUMTEXT. Note that this conversion
results in a change in behavior with regard to treatment of
trailing spaces.
Similar conversions occur for BINARY
and VARBINARY, except that they are
converted to a BLOB type.
For a specification of
DECIMAL(M,D),
if M is not larger
than
D, it is adjusted
upward. For example, DECIMAL(10,10)
becomes
DECIMAL(11,10).
Other silent column specification changes include changes to attribute
or index specifications:
TIMESTAMP display sizes are discarded
from MySQL 4.1 on, due to changes made to the
TIMESTAMP data type in that version.
Before MySQL 4.1, TIMESTAMP display
sizes must be even and in the range from 2 to 14. If you specify
a display size of 0 or greater than 14, the size is coerced to
14. Odd-valued sizes in the range from 1 to 13 are coerced to
the next higher even number.
Before MySQL 4.1.6, you cannot store a literal
NULL in a
TIMESTAMP
column; setting it to NULL sets it to
the current date and time. Because
TIMESTAMP columns behave this way,
the
NULL and NOT
NULL
attributes do not apply in the normal way and are ignored if you
specify them. DESCRIBE
tbl_name always
reports that a TIMESTAMP column can
be assigned NULL values.
Columns that are part of a PRIMARY KEY
are made NOT NULL even if not
declared that way.
Starting from MySQL 3.23.51, trailing spaces are automatically
deleted from ENUM and
SET member values when the table is
created.
If you include a USING clause to
specify an index type that is not legal for a given storage
engine, but there is another index type available that the
engine can use without affecting query results, the engine uses
the available type.
To see whether MySQL used a data type other than the one you
specified, issue a DESCRIBE or
SHOW CREATE TABLE statement after
creating or altering the table.
DROP DATABASE drops all tables in the
database and deletes the database. Be very
careful with this statement! To use DROP DATABASE,
you need the DROP
privilege on the database.
In MySQL 3.22 or later, you can use the keywords
IF EXISTS to prevent an error from occurring if the database does
not exist.
If you use DROP DATABASE on a symbolically
linked database, both the link and the original database are deleted.
As of MySQL 4.1.2, DROP DATABASE returns
the number of tables that were removed. This corresponds to the number
of .frm files removed.
The DROP DATABASE statement removes from
the given database directory those files and directories that MySQL
itself may create during normal operation:
All files with these extensions:
.BAK
.DAT
.HSH
.ISD
.ISM
.MRG
.MYD
.MYI
.db
.frm
.ibd
.ndb
All subdirectories with names that consist of two hex digits
00-ff.
These are subdirectories used for RAID
tables. (These directories are not removed in versions of MySQL
after 4.1, where support for RAID
tables is removed. You should convert any existing
RAID tables and remove these
directories manually before upgrading to later MySQL versions.)
The db.opt file, if it exists.
If other files or directories remain in the database directory after
MySQL removes those just listed, the database directory cannot be
removed. In this case, you must remove any remaining files or
directories manually and issue the DROP DATABASE
statement again.
DROP INDEX drops the index named
index_name from the table
tbl_name. In MySQL 3.22 or
later,
DROP INDEX is mapped to an
ALTER TABLE statement to drop the index. See
Section 13.1.2, “ALTER TABLE Syntax”.
DROP INDEX
does not do anything prior to MySQL 3.22.