Table of Contents
- 13.1. Data Definition Statements
- 13.2. Data Manipulation Statements
- 13.3. MySQL Utility Statements
- 13.4. MySQL Transactional and Locking Statements
-
-
13.4.1.
START TRANSACTION
,COMMIT
, andROLLBACK
Syntax - 13.4.2. Statements That Cannot Be Rolled Back
- 13.4.3. Statements That Cause an Implicit Commit
-
13.4.4.
SAVEPOINT
andROLLBACK TO SAVEPOINT
Syntax -
13.4.5.
LOCK TABLES
andUNLOCK TABLES
Syntax -
13.4.6.
SET TRANSACTION
Syntax - 13.4.7. XA Transactions
-
13.4.1.
- 13.5. Database Administration Statements
- 13.6. Replication Statements
- 13.7. SQL Syntax for Prepared Statements
This chapter describes the syntax for most of the SQL statements supported by MySQL. Additional statement descriptions can be found in the following chapters:
-
The
EXPLAIN
statement is discussed in Chapter 7, Optimization. -
Statements for writing stored routines are covered in Chapter 17, Stored Procedures and Functions.
-
Statements for writing triggers are covered in Chapter 18, Triggers.
-
View-related statements are covered in Chapter 19, Views.
ALTER {DATABASE | SCHEMA} [db_name
]alter_specification
[,alter_specification
] ...alter_specification
: [DEFAULT] CHARACTER SETcharset_name
| [DEFAULT] COLLATEcollation_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.
ALTER SCHEMA
is a synonym for ALTER
DATABASE
as of MySQL 5.0.2.
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.
The database name can be omitted, in which case the statement applies to the default database.
ALTER [IGNORE] TABLEtbl_name
alter_specification
[,alter_specification
] ...alter_specification
: ADD [COLUMN]column_definition
[FIRST | AFTERcol_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 DEFAULTliteral
| DROP DEFAULT} | CHANGE [COLUMN]old_col_name
column_definition
[FIRST|AFTERcol_name
] | MODIFY [COLUMN]column_definition
[FIRST | AFTERcol_name
] | DROP [COLUMN]col_name
| DROP PRIMARY KEY | DROP {INDEX|KEY}index_name
| DROP FOREIGN KEYfk_symbol
| DISABLE KEYS | ENABLE KEYS | RENAME [TO]new_tbl_name
| ORDER BYcol_name
| CONVERT TO CHARACTER SETcharset_name
[COLLATEcollation_name
] | [DEFAULT] CHARACTER SETcharset_name
[COLLATEcollation_name
] | DISCARD TABLESPACE | IMPORT TABLESPACE |table_option
...index_col_name
:col_name
[(length
)] [ASC | DESC]index_type
: USING {BTREE | HASH}
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. As of
MySQL 5.0.23, to prevent inadvertent loss of data,
ALTER TABLE
cannot be used to change the
storage engine of a table to MERGE
or
BLACKHOLE
.
Some operations may result in warnings if attempted on a table
for which the storage engine does not support the operation.
These warnings can be displayed with SHOW
WARNINGS
. See Section 13.5.4.25, “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”.
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 needALTER
,INSERT
, andCREATE
privileges for the table. -
IGNORE
is a MySQL extension to standard SQL. It controls howALTER TABLE
works if there are duplicates on unique keys in the new table or if warnings occur when strict mode is enabled. IfIGNORE
is not specified, the copy is aborted and rolled back if duplicate-key errors occur. IfIGNORE
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
, andCHANGE
clauses in a singleALTER TABLE
statement, separated by commas. This is a MySQL extension to standard SQL, which allows only one of each clause perALTER 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
, andDROP INDEX
are MySQL extensions to standard SQL. -
MODIFY
is an Oracle extension toALTER TABLE
. -
The word
COLUMN
is optional and can be omitted. -
column_definition
clauses use the same syntax forADD
andCHANGE
as forCREATE 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_name
column_definition
clause. To do so, specify the old and new column names and the type that the column currently has. For example, to rename anINTEGER
column froma
tob
, 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;
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
orMODIFY
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
orMODIFY
, MySQL tries to convert existing column values to the new type as well as possible. -
To add a column at a specific position within a table row, use
FIRST
orAFTER
col_name
. The default is to add the column last. You can also useFIRST
andAFTER
inCHANGE
orMODIFY
operations. -
ALTER ... SET DEFAULT
orALTER ... 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 beNULL
, the new default isNULL
. If the column cannot beNULL
, MySQL assigns a default value, as described in Section 11.1.4, “Data Type Default Values”. -
DROP INDEX
removes an index. This is a MySQL extension to standard SQL. See Section 13.1.7, “DROP INDEX
Syntax”. -
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. Note: In older versions of MySQL, if no primary index existed,DROP PRIMARY KEY
would drop the firstUNIQUE
index in the table. This is not the case in MySQL 5.0, where trying to useDROP PRIMARY KEY
on a table with no primary key results in an error.If you add a
UNIQUE INDEX
orPRIMARY KEY
to a table, it is stored before any non-unique index so that MySQL can detect duplicate keys as early as possible. -
Some storage engines allow you to specify an index type when creating an index. The syntax for the
index_type
specifier isUSING
type_name
. For details aboutUSING
, see Section 13.1.4, “CREATE INDEX
Syntax”. -
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 aMyISAM
table, all non-unique indexes are created in a separate batch (as forREPAIR TABLE
). This should makeALTER TABLE
much faster when you have many indexes.This feature can be activated explicitly.
ALTER TABLE ... DISABLE KEYS
tells MySQL to stop updating non-unique indexes for aMyISAM
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. UsingALTER TABLE ... DISABLE KEYS
requires theINDEX
privilege in addition to the privileges mentioned earlier. -
The
FOREIGN KEY
andREFERENCES
clauses are supported by theInnoDB
storage engine, which implementsADD [CONSTRAINT [
symbol
]] FOREIGN KEY (...) REFERENCES ... (...). See Section 14.2.6.4, “FOREIGN KEY
Constraints”. For other storage engines, the clauses are parsed but ignored. TheCHECK
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. -
InnoDB
supports the use ofALTER TABLE
to drop foreign keys:ALTER TABLE
tbl_name
DROP FOREIGN KEYfk_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.For more information, see Section 14.2.6.4, “
FOREIGN KEY
Constraints”. -
Pending
INSERT DELAYED
statements are lost if a table is write locked andALTER TABLE
is used to modify the table structure. -
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 SETcharset_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 (likeutf8
). 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
, theCHAR
,VARCHAR
, andTEXT
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 subsequentCONVERT 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 SETcharset_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, withALTER TABLE ... ADD column
). -
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:ALTER TABLE
tbl_name
IMPORT TABLESPACE;
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 22.2.3.34, “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 5.0.3, 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:
DROP t1; ALTER TABLE t2 RENAME t1;
CREATE {DATABASE | SCHEMA} [IF NOT EXISTS]db_name
[create_specification
[,create_specification
] ...]create_specification
: [DEFAULT] CHARACTER SETcharset_name
| [DEFAULT] COLLATEcollation_name
CREATE DATABASE
creates a database with the
given name. To use this statement, you need the
CREATE
privilege for the database.
CREATE SCHEMA
is a synonym for
CREATE DATABASE
as of MySQL 5.0.2.
An error occurs if the database exists and you did not specify
IF NOT EXISTS
.
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 creates only a
directory under the MySQL data directory and the
db.opt
file. 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
.
You can also use the mysqladmin program to create databases. See Section 8.9, “mysqladmin — Client for Administering a MySQL Server”.
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEXindex_name
[index_type
] ONtbl_name
(index_col_name
,...)index_col_name
:col_name
[(length
)] [ASC | DESC]index_type
: USING {BTREE | HASH}
CREATE INDEX
is mapped to an ALTER
TABLE
statement to create indexes. See
Section 13.1.2, “ALTER TABLE
Syntax”. For more information about
indexes, see Section 7.4.5, “How MySQL Uses Indexes”.
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). 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.
SPATIAL
indexes are supported only for
MyISAM
tables and can include only spatial
columns that are defined as NOT NULL
.
Chapter 16, Spatial Extensions, describes the spatial data
types.
In MySQL 5.0:
-
You can add an index on a column that can have
NULL
values only if you are using theMyISAM
,InnoDB
,BDB
, orMEMORY
storage engine. -
You can add an index on a
BLOB
orTEXT
column only if you are using theMyISAM
,BDB
, orInnoDB
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.
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
(create_definition
,...) [table_option
...]
Or:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS]tbl_name
[(create_definition
,...)] [table_option
...]select_statement
Or:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS]tbl_name
{ LIKEold_tbl_name
| (LIKEold_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_name
data_type
[NOT NULL | NULL] [DEFAULTdefault_value
] [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY] [COMMENT 'string
'] [reference_definition
]data_type
: BIT[(length
)] | 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 SETcharset_name
] [COLLATEcollation_name
] | VARCHAR(length
) [CHARACTER SETcharset_name
] [COLLATEcollation_name
] | BINARY(length
) | VARBINARY(length
) | TINYBLOB | BLOB | MEDIUMBLOB | LONGBLOB | TINYTEXT [BINARY] [CHARACTER SETcharset_name
] [COLLATEcollation_name
] | TEXT [BINARY] [CHARACTER SETcharset_name
] [COLLATEcollation_name
] | MEDIUMTEXT [BINARY] [CHARACTER SETcharset_name
] [COLLATEcollation_name
] | LONGTEXT [BINARY] [CHARACTER SETcharset_name
] [COLLATEcollation_name
] | ENUM(value1
,value2
,value3
,...) [CHARACTER SETcharset_name
] [COLLATEcollation_name
] | SET(value1
,value2
,value3
,...) [CHARACTER SETcharset_name
] [COLLATEcollation_name
] |spatial_type
index_col_name
:col_name
[(length
)] [ASC | DESC]index_type
: USING {BTREE | HASH}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_option
: {ENGINE|TYPE} [=]engine_name
| AUTO_INCREMENT [=]value
| AVG_ROW_LENGTH [=]value
| [DEFAULT] CHARACTER SETcharset_name
| CHECKSUM [=] {0 | 1} | COLLATEcollation_name
| COMMENT [=] 'string
' | CONNECTION [=] 'connect_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
' | 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.
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`
.
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.)
To create temporary tables, you must have the CREATE
TEMPORARY TABLES
privilege.
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:
File | Purpose |
tbl_name .frm |
Table format (definition) file |
tbl_name .MYD |
Data file |
tbl_name .MYI |
Index file |
Chapter 14, Storage Engines and Table Types, describes what files each storage engine creates to represent tables.
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
norNOT NULL
is specified, the column is treated as thoughNULL
had been specified. -
An integer column can have the additional attribute
AUTO_INCREMENT
. When you insert a value ofNULL
(recommended) or0
into an indexedAUTO_INCREMENT
column, the column is set to the next sequence value. Typically this isvalue
+1, wherevalue
is the largest value for the column currently in the table.AUTO_INCREMENT
sequences begin with1
.To retrieve an
AUTO_INCREMENT
value after inserting a row, use theLAST_INSERT_ID()
SQL function or themysql_insert_id()
C API function. See Section 12.9.3, “Information Functions”, and Section 22.2.3.36, “mysql_insert_id()
”.If the
NO_AUTO_VALUE_ON_ZERO
SQL mode is enabled, you can store0
inAUTO_INCREMENT
columns as0
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 aDEFAULT
value. AnAUTO_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 anAUTO_INCREMENT
column that contains0
.For
MyISAM
andBDB
tables, you can specify anAUTO_INCREMENT
secondary column in a multiple-column key. See Section 3.6.9, “UsingAUTO_INCREMENT
”.To make MySQL compatible with some ODBC applications, you can find the
AUTO_INCREMENT
value for the last inserted row with the following query:SELECT * FROM
tbl_name
WHEREauto_col
IS NULLFor information about
InnoDB
andAUTO_INCREMENT
, see Section 14.2.6.3, “HowAUTO_INCREMENT
Columns Work inInnoDB
”. -
The attribute
SERIAL
is an alias forBIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE
. -
Character data types (
CHAR
,VARCHAR
,TEXT
) can includeCHARACTER SET
andCOLLATE
attributes to specify the character set and collation for the column. For details, see Chapter 10, Character Set Support.CHARSET
is a synonym forCHARACTER SET
. Example:CREATE TABLE t (c CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin);
MySQL 5.0 interprets length specifications in character column definitions in characters. (Versions before MySQL 4.1 interpreted them in bytes.) Lengths for
BINARY
andVARBINARY
are in bytes. -
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 asNOW()
orCURRENT_DATE
. The exception is that you can specifyCURRENT_TIMESTAMP
as the default for aTIMESTAMP
column. See Section 11.3.1.1, “TIMESTAMP
Properties as of MySQL 4.1”.If a column definition includes no explicit
DEFAULT
value, MySQL determines the default value as described in Section 11.1.4, “Data Type Default Values”.BLOB
andTEXT
columns cannot be assigned a default value. -
A comment for a column can be specified with the
COMMENT
option, up to 255 characters long. The comment is displayed by theSHOW CREATE TABLE
andSHOW FULL COLUMNS
statements. -
KEY
is normally a synonym forINDEX
. The key attributePRIMARY KEY
can also be specified as justKEY
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 toNULL
values except for theBDB
storage engine. For other engines, aUNIQUE
index allows multipleNULL
values for columns that can containNULL
. -
A
PRIMARY KEY
is a unique index where all key columns must be defined asNOT NULL
. If they are not explicitly declared asNOT NULL
, MySQL declares them so implicitly (and silently). A table can have only onePRIMARY KEY
. If you do not have aPRIMARY KEY
and an application asks for thePRIMARY KEY
in your tables, MySQL returns the firstUNIQUE
index that has noNULL
columns as thePRIMARY KEY
.In
InnoDB
tables, having a longPRIMARY KEY
wastes a lot of space. (See Section 14.2.13, “InnoDB
Table and Index Structures”.) -
In the created table, a
PRIMARY KEY
is placed first, followed by allUNIQUE
indexes, and then the non-unique indexes. This helps the MySQL optimizer to prioritize which index to use and also more quickly to detect duplicatedUNIQUE
keys. -
A
PRIMARY KEY
can be a multiple-column index. However, you cannot create a multiple-column index using thePRIMARY KEY
key attribute in a column specification. Doing so only marks that single column as primary. You must use a separatePRIMARY KEY(
index_col_name
, ...) clause. -
If a
PRIMARY KEY
orUNIQUE
index consists of only one column that has an integer type, you can also refer to the column as_rowid
inSELECT
statements. -
In MySQL, the name of a
PRIMARY KEY
isPRIMARY
. 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 usingSHOW INDEX FROM
tbl_name
. See Section 13.5.4.13, “SHOW INDEX
Syntax”. -
Some storage engines allow you to specify an index type when creating an index. The syntax for the
index_type
specifier isUSING
type_name
.Example:
CREATE TABLE lookup (id INT, INDEX USING BTREE (id)) ENGINE = MEMORY;
For details about
USING
, see Section 13.1.4, “CREATE INDEX
Syntax”.For more information about indexes, see Section 7.4.5, “How MySQL Uses Indexes”.
-
In MySQL 5.0, only the
MyISAM
,InnoDB
,BDB
, andMEMORY
storage engines support indexes on columns that can haveNULL
values. In other cases, you must declare indexed columns asNOT NULL
or an error results. -
For
CHAR
,VARCHAR
,BINARY
, andVARBINARY
columns, indexes can be created that use only the leading part of column values, usingcol_name
(length
) syntax to specify an index prefix length.BLOB
andTEXT
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 firstlength
characters of each column value forCHAR
,VARCHAR
, andTEXT
columns, and the firstlength
bytes of each column value forBINARY
,VARBINARY
, andBLOB
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
,BDB
, andInnoDB
storage engines support indexing onBLOB
andTEXT
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). Note that prefix limits are measured in bytes, whereas the prefix length inCREATE 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 withASC
orDESC
. 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
orGROUP BY
on aTEXT
orBLOB
column in aSELECT
, the server sorts values using only the initial number of bytes indicated by themax_sort_length
system variable. See Section 11.4.3, “TheBLOB
andTEXT
Types”. -
You can create special
FULLTEXT
indexes, which are used for full-text searches. Only theMyISAM
storage engine supportsFULLTEXT
indexes. They can be created only fromCHAR
,VARCHAR
, andTEXT
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. -
You can create
SPATIAL
indexes on spatial data types. Spatial types are supported only forMyISAM
tables and indexed columns must be declared asNOT NULL
. See Chapter 16, Spatial Extensions. -
InnoDB
tables support checking of foreign key constraints. See Section 14.2, “TheInnoDB
Storage Engine”. Note that theFOREIGN KEY
syntax inInnoDB
is more restrictive than the syntax presented for theCREATE TABLE
statement at the beginning of this section: The columns of the referenced table must always be explicitly named.InnoDB
supports bothON DELETE
andON UPDATE
actions on foreign keys. For the precise syntax, see Section 14.2.6.4, “FOREIGN KEY
Constraints”.For other storage engines, MySQL Server parses and ignores the
FOREIGN KEY
andREFERENCES
syntax inCREATE TABLE
statements. TheCHECK
clause is parsed but ignored by all storage engines. See Section 1.9.5.5, “Foreign Keys”. -
For
MyISAM
tables, eachNULL
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 forNULL
columns than forNOT NULL
columns.
The ENGINE
table option specifies the storage
engine for the table. TYPE
is a synonym, but
ENGINE
is the preferred option name.
The ENGINE
table option takes the storage
engine names shown in the following table.
Storage Engine | Description |
ARCHIVE
|
The archiving storage engine. See
Section 14.8, “The ARCHIVE Storage Engine”. |
BDB
|
Transaction-safe tables with page locking. Also known as
BerkeleyDB . See
Section 14.5, “The BDB (BerkeleyDB ) Storage
Engine”. |
CSV
|
Tables that store rows in comma-separated values format. See
Section 14.9, “The CSV Storage Engine”. |
EXAMPLE
|
An example engine. See Section 14.6, “The EXAMPLE Storage Engine”. |
FEDERATED
|
Storage engine that accesses remote tables. See
Section 14.7, “The FEDERATED Storage Engine”. |
HEAP
|
This is a synonym for MEMORY . |
ISAM (OBSOLETE) |
Not available in MySQL 5.0. If you are upgrading to MySQL
5.0 from a previous version, you should
convert any existing ISAM tables to
MyISAM before
performing the upgrade. |
InnoDB
|
Transaction-safe tables with row locking and foreign keys. See
Section 14.2, “The InnoDB Storage Engine”. |
MEMORY
|
The data for this storage engine is stored only in memory. See
Section 14.4, “The MEMORY (HEAP ) Storage Engine”. |
MERGE
|
A collection of MyISAM tables used as one table. Also
known as MRG_MyISAM . See
Section 14.3, “The MERGE Storage Engine”. |
MyISAM
|
The binary portable storage engine that is the default storage engine
used by MySQL. See
Section 14.1, “The MyISAM Storage Engine”. |
NDBCLUSTER
|
Clustered, fault-tolerant, memory-based tables. Also known as
NDB . See
Chapter 15, MySQL Cluster. |
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
5.0, 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. In MySQL 5.0, this works forMyISAM
andMEMORY
tables. It is also supported forInnoDB
as of MySQL 5.0.3. To set the first auto-increment value for engines that do not support theAUTO_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 inCREATE TABLE
statements, you can also useALTER TABLE
tbl_name
AUTO_INCREMENT =N
to reset theAUTO_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 theMAX_ROWS
andAVG_ROW_LENGTH
options to decide how big the resulting table is. If you don't specify either option, the maximum size for a table is 65,536TB of data (4GB before MySQL 5.0.6). (If your operating system does not support files that large, table sizes are constrained by the file size limit.) If you want to keep down the pointer sizes to make the index smaller and faster and you don't really need big files, you can decrease the default pointer size by setting themyisam_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 can increase the default pointer size by setting this variable. -
[DEFAULT] CHARACTER SET
Specify a default character set for the table.
CHARSET
is a synonym forCHARACTER 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.
-
CONNECTION
The connection string for a
FEDERATED
table. This option is available as of MySQL 5.0.13; before that, use aCOMMENT
option for the connection string. -
DATA DIRECTORY
,INDEX DIRECTORY
By using
DATA DIRECTORY='
directory
' orINDEX DIRECTORY='
directory
' you can specify where theMyISAM
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 when you are not using the
--skip-symbolic-links
option. Your operating system must also have a working, thread-saferealpath()
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 withINSERT_METHOD
the table into which the row should be inserted.INSERT_METHOD
is an option useful forMERGE
tables only. Use a value ofFIRST
orLAST
to have inserts go to the first or last table, or a value ofNO
to prevent inserts. See Section 14.3, “TheMERGE
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 withMyISAM
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 toDEFAULT
tells the storage engine to pack only longCHAR
orVARCHAR
columns.If you do not use
PACK_KEYS
, the default is to pack strings, but not numbers. If you usePACK_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 haveNULL
values. (In this case, the packed key length is stored in the same byte that is used to mark if a key isNULL
.) -
-
PASSWORD
Encrypt the
.frm
file with a password. This option does nothing in the standard MySQL version. -
ROW_FORMAT
Defines how the rows should be stored. For
MyISAM
tables, the option value can beFIXED
orDYNAMIC
for static or variable-length row format. myisampack sets the type toCOMPRESSED
. See Section 14.1.3, “MyISAM
Table Storage Formats”.Starting with MySQL 5.0.3, for
InnoDB
tables, rows are stored in compact format (ROW_FORMAT=COMPACT
) by default. The non-compact format used in older versions of MySQL can still be requested by specifyingROW_FORMAT=REDUNDANT
. -
RAID_TYPE
RAID
support has been removed as of MySQL 5.0. For information onRAID
, see http://dev.mysql.com/doc/refman/4.1/en/create-table.html. -
UNION
UNION
is used when you want to access a collection of identicalMyISAM
tables as one. This works only withMERGE
tables. See Section 14.3, “TheMERGE
Storage Engine”.You must have
SELECT
,UPDATE
, andDELETE
privileges for the tables you map to aMERGE
table. (Note: Formerly, all tables used had to be in the same database as theMERGE
table itself. This restriction no longer applies.)
You can create one table from another by adding a
SELECT
statement at the end of the
CREATE TABLE
statement:
CREATE TABLEnew_tbl
SELECT * FROMorig_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))
->ENGINE=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;
You can also explicitly specify the data type for a generated column:
CREATE TABLE foo (a TINYINT NOT NULL) SELECT b+1 AS a FROM bar;
Use LIKE
to create an empty table based on
the definition of another table, including any column attributes
and indexes defined in the original table:
CREATE TABLEnew_tbl
LIKEorig_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 binary log can be used to re-create the
original tables, MySQL does not allow concurrent inserts during
CREATE TABLE ... SELECT
.
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.
Possible data type changes are given in the following list. These occur prior to MySQL 5.0.3. As of 5.0.3, an error occurs if a column cannot be created using the specified data type.
-
VARCHAR
columns with a length less than four are changed toCHAR
. -
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
, orBLOB
), allCHAR
columns longer than three characters are changed toVARCHAR
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. -
Before MySQL 5.0.3, a
CHAR
orVARCHAR
column with a length specification greater than 255 is converted to the smallestTEXT
type that can hold values of the given length. For example,VARCHAR(500)
is converted toTEXT
, andVARCHAR(200000)
is converted toMEDIUMTEXT
. Note that this conversion results in a change in behavior with regard to treatment of trailing spaces.Similar conversions occur for
BINARY
andVARBINARY
, except that they are converted to aBLOB
type.Starting with MySQL 5.0.3, a
CHAR
orBINARY
column with a length specification greater than 255 is not silently converted. Instead, an error occurs. From MySQL 5.0.6 on, silent conversion ofVARCHAR
andVARBINARY
columns with a length specification greater than 65,535 does not occur if strict SQL mode is enabled. Instead, an error occurs. -
For a specification of
DECIMAL(
M
,D
), ifM
is not larger thanD
, it is adjusted upward. For example,DECIMAL(10,10)
becomesDECIMAL(11,10)
.
Other silent column specification changes include changes to attribute or index specifications:
-
TIMESTAMP
display sizes are discarded. Note thatTIMESTAMP
columns have changed considerably in recent versions of MySQL prior to 5.0; for a description of these changes, see the MySQL 3.23, 4.0, 4.1 Reference Manual. -
Columns that are part of a
PRIMARY KEY
are madeNOT NULL
even if not declared that way. -
Trailing spaces are automatically deleted from
ENUM
andSET
member values when the table is created. -
MySQL maps certain data types used by other SQL database vendors to MySQL types. See Section 11.7, “Using Data Types from Other Database Engines”.
-
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.
Certain other data type changes can occur if you compress a table using myisampack. See Section 14.1.3.3, “Compressed Table Characteristics”.
DROP {DATABASE | SCHEMA} [IF EXISTS] db_name
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. DROP SCHEMA
is a
synonym for DROP DATABASE
as of MySQL 5.0.2.
IF EXISTS
is used 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.
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
.MRG
.MYD
.MYI
.TRG
.TRN
.db
.frm
.ibd
.ndb
-
All subdirectories with names that consist of two hex digits
00
-ff
. These are subdirectories used forRAID
tables. (These directories are not removed as of MySQL 5.0, when support forRAID
tables was removed. You should convert any existingRAID
tables and remove these directories manually before upgrading to MySQL 5.0. See Section 2.11.2, “Upgrading from MySQL 4.1 to 5.0”.) -
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.
You can also drop databases with mysqladmin. See Section 8.9, “mysqladmin — Client for Administering a MySQL Server”.
DROP INDEXindex_name
ONtbl_name
DROP INDEX
drops the index named
index_name
from the table
tbl_name
. This statement is mapped to
an ALTER TABLE
statement to drop the index.
See Section 13.1.2, “ALTER TABLE
Syntax”.
DROP [TEMPORARY] TABLE [IF EXISTS]tbl_name
[,tbl_name
] ... [RESTRICT | CASCADE]
DROP TABLE
removes one or more tables. You
must have the DROP
privilege for each table.
All table data and the table definition are
removed, so be careful
with this statement! If any of the tables named in the argument
list do not exist, MySQL returns an error indicating by name
which non-existing tables it was unable to drop, but it also
drops all of the tables in the list that do exist.
Use IF EXISTS
to prevent an error from
occurring for tables that do not exist. A
NOTE
is generated for each non-existent table
when using IF EXISTS
. See
Section 13.5.4.25, “SHOW WARNINGS
Syntax”.
RESTRICT
and CASCADE
are
allowed to make porting easier. For the moment, they do nothing.
Note: DROP
TABLE
automatically commits the current active
transaction, unless you use the TEMPORARY
keyword.
The TEMPORARY
keyword has the following
effects:
-
The statement drops only
TEMPORARY
tables. -
The statement does not end an ongoing transaction.
-
No access rights are checked. (A
TEMPORARY
table is visible only to the client that created it, so no check is necessary.)
Using TEMPORARY
is a good way to ensure that
you do not accidentally drop a non-TEMPORARY
table.
RENAME TABLEtbl_name
TOnew_tbl_name
[,tbl_name2
TOnew_tbl_name2
] ...
This statement renames one or more tables.
The rename operation is done atomically, which means that no
other thread can access any of the tables while the rename is
running. For example, if you have an existing table
old_table
, you can create another table
new_table
that has the same structure but is
empty, and then replace the existing table with the empty one as
follows (assuming that backup_table
does not
already exist):
CREATE TABLE new_table (...); RENAME TABLE old_table TO backup_table, new_table TO old_table;
If the statement renames more than one table, renaming
operations are done from left to right. If you want to swap two
table names, you can do so like this (assuming that
tmp_table
does not already exist):
RENAME TABLE old_table TO tmp_table, new_table TO old_table, tmp_table TO new_table;
As long as two databases are on the same filesystem, you can use
RENAME TABLE
to move a table from one
database to another:
RENAME TABLEcurrent_db.tbl_name
TOother_db.tbl_name;
As of MySQL 5.0.14, RENAME TABLE
also works
for views, as long as you do not try to rename a view into a
different database.
When you execute RENAME
, you cannot have any
locked tables or active transactions. You must also have the
ALTER
and DROP
privileges
on the original table, and the CREATE
and
INSERT
privileges on the new table.
If MySQL encounters any errors in a multiple-table rename, it does a reverse rename for all renamed tables to return everything to its original state.