Table of Contents
This chapter describes the syntax for SQL statements.
ALTER {DATABASE | SCHEMA} [db_name]
alter_specification [, alter_specification] ...
alter_specification:
[DEFAULT] CHARACTER SET charset_name
| [DEFAULT] COLLATE collation_name
ALTER DATABASE allows 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. Character set and
collation names are discussed in Chapter 10, Character Set Support.
The database name can be omitted, in which case, the statement
applies to the default database. ALTER SCHEMA
can be used as of MySQL 5.0.2.
ALTER [IGNORE] TABLEtbl_namealter_specification[,alter_specification] ...alter_specification: ADD [COLUMN]column_definition[FIRST | AFTERcol_name] | ADD [COLUMN] (column_definition,...) | ADD INDEX [index_name] [index_type] (index_col_name,...) | ADD [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...) | ADD [CONSTRAINT [symbol]] UNIQUE [index_name] [index_type] (index_col_name,...) | ADD [FULLTEXT|SPATIAL] [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_namecolumn_definition[FIRST|AFTERcol_name] | MODIFY [COLUMN]column_definition[FIRST | AFTERcol_name] | DROP [COLUMN]col_name| DROP PRIMARY KEY | DROP INDEXindex_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_options
ALTER TABLE allows 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_options modifications,
for options such as ENGINE,
AUTO_INCREMENT, and
AVG_ROW_LENGTH. See
Section 13.1.5, “CREATE TABLE Syntax”.
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.22, “SHOW WARNINGS Syntax”.
If you use ALTER TABLE to change a column
specification but DESCRIBE
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 tbl_nameVARCHAR column to
CHAR, MySQL still uses
VARCHAR if the table contains other
variable-length columns.
ALTER TABLE works by making a temporary copy
of the original table. The alteration is performed on the copy,
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, then are
automatically redirected to the new table without any failed
updates.
Note that if you use any other option to ALTER
TABLE 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, then for
rows with duplicates on a unique key, only the first row is
used. The others conflicting rows are deleted. Wrong 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:
mysql> ALTER TABLE t2 DROP COLUMN c, DROP COLUMN d;
CHANGE
, col_nameDROP
, and
col_nameDROP INDEX are MySQL extensions to
standard SQL.
MODIFY is an Oracle extension to
ALTER TABLE.
The word COLUMN is purely optional and
can be omitted.
If you use ALTER TABLE
without
any other options, MySQL simply renames any files that
correspond to the table tbl_name RENAME TO
new_tbl_nametbl_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”.)
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 the column type. See
Section 13.1.5, “CREATE TABLE Syntax”.
You can rename a column using a CHANGE
clause. To do so, specify the old and new column names and
the type that the column currently has. For example, to
rename an old_col_name
column_definitionINTEGER column from
a to b, you can do
this:
mysql> 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:
mysql> ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;
You can also use MODIFY to change a
column's type without renaming it:
mysql> 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 column type using
CHANGE or MODIFY,
MySQL tries to convert existing column values to the new
type as well as possible.
You can use FIRST or AFTER
to add a
column at a specific position within a table row. The
default is to add the column last. You can also use
col_nameFIRST and AFTER in
CHANGE or MODIFY
operations.
ALTER COLUMN specifies a new default
value for a column or removes the old default value. 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 13.1.5, “CREATE TABLE Syntax”.
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, then DROP PRIMARY
KEY would drop the first UNIQUE
index in the table. This is not the case in MySQL
5.0, where trying to use DROP PRIMARY
KEY on a table with no primary key will give rise
to an error.
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 allows 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 mainly useful when you know that you are
mostly going to query the rows in a certain order; by using
this option after big 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.
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
[. See
Section 14.2.6.4, “symbol]] FOREIGN KEY (...)
REFERENCES ... (...)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.8.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 of ALTER
TABLE to drop foreign keys:
ALTER TABLEyourtablenameDROP 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”.
ALTER TABLE ignores the DATA
DIRECTORY and INDEX DIRECTORY
table options.
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 TABLEtbl_nameCONVERT 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 (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 TABLEtbl_nameDEFAULT 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, with ALTER TABLE ... ADD
column).
Warning: ALTER
TABLE ... DEFAULT CHARACTER SET and ALTER
TABLE ... CHARACTER SET are equivalent and change
only the default table 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, then
issue this statement:
ALTER TABLE tbl_name IMPORT TABLESPACE;
With the mysql_info() C API function, you
can find out how many records were copied, and (when
IGNORE is used) how many records 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:
mysql> CREATE TABLE t1 (a INTEGER,b CHAR(10));
To rename the table from t1 to
t2:
mysql> 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:
mysql> ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);
To add a new TIMESTAMP column named
d:
mysql> ALTER TABLE t2 ADD d TIMESTAMP;
To add indexes on column d and on column
a:
mysql> ALTER TABLE t2 ADD INDEX (d), ADD INDEX (a);
To remove column c:
mysql> ALTER TABLE t2 DROP COLUMN c;
To add a new AUTO_INCREMENT integer column
named c:
mysql>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= before
valueALTER TABLE or by using the
AUTO_INCREMENT=
table option. See Section 13.5.3, “valueSET Syntax”.
From MySQL 5.0.3, you can use the ALTER TABLE ...
AUTO_INCREMENT= table
option for valueInnoDB 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.
CREATE {DATABASE | SCHEMA} [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 CREATE DATABASE, you need
the CREATE privilege on the database.
Rules for allowable database names are given in
Section 9.2, “Database, Table, Index, Column, and Alias Names”. 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. Character set and
collation names are discussed in Chapter 10, Character Set Support.
Databases in MySQL are implemented as directories 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.
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.
CREATE SCHEMA can be used as of MySQL 5.0.2.
You can also use the mysqladmin program to create databases. See Section 8.5, “mysqladmin — Client for Administering a MySQL Server”.
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEXindex_name[USINGindex_type] ONtbl_name(index_col_name,...)index_col_name:col_name[(length)] [ASC | DESC]
CREATE INDEX is mapped to an ALTER
TABLE statement to create indexes. See
Section 13.1.2, “ALTER TABLE Syntax”.
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 allows 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 and VARCHAR
columns, indexes can be created that use only part of a column,
using
syntax to index a prefix consisting of the first
col_name(length)length characters of each column
value. BLOB and TEXT
columns also can be indexed, but a prefix length
must be given.
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));
Because most names 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. Take this into account when specifying a prefix
length for a column that uses a multi-byte character set.
In MySQL 5.0:
You can add an index on a column that can have
NULL values only if you are using the
MyISAM, InnoDB, or
BDB table type.
You can add an index on a BLOB or
TEXT column only if you are using the
MyISAM, BDB, or
InnoDB table type.
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 syntax for the
index_type specifier is
USING .
The allowable type_nametype_name 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 |
Example:
CREATE TABLE lookup (id INT) ENGINE = MEMORY; CREATE INDEX id_index USING BTREE ON lookup (id);
TYPE can
be used as a synonym for type_nameUSING
to specify an
index type. However, type_nameUSING is the preferred
form. In addition, the index name that precedes the index type
in the index specification syntax is not optional with
TYPE. This is because, unlike
USING, TYPE is not a
reserved word and thus is interpreted as an index name.
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.
For more information about how MySQL uses indexes, see Section 7.4.5, “How MySQL Uses Indexes”.
FULLTEXT indexes can index only
CHAR, VARCHAR, and
TEXT columns, and only in
MyISAM tables. See
Section 12.7, “Full-Text Search Functions”.
SPATIAL indexes can index only spatial
columns, and only in MyISAM tables. Spatial
column types are described in
Chapter 16, Spatial Extensions in MySQL.
CREATE [TEMPORARY] TABLE [IF NOT EXISTS]tbl_name[(create_definition,...)] [table_options] [select_statement]
Or:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS]tbl_name[(] LIKEold_tbl_name[)];create_definition:column_definition| [CONSTRAINT [symbol]] PRIMARY KEY [index_type] (index_col_name,...) | KEY [index_name] [index_type] (index_col_name,...) | INDEX [index_name] [index_type] (index_col_name,...) | [CONSTRAINT [symbol]] UNIQUE [INDEX] [index_name] [index_type] (index_col_name,...) | [FULLTEXT|SPATIAL] [INDEX] [index_name] (index_col_name,...) | [CONSTRAINT [symbol]] FOREIGN KEY [index_name] (index_col_name,...) [reference_definition] | CHECK (expr)column_definition:col_nametype[NOT NULL | NULL] [DEFAULTdefault_value] [AUTO_INCREMENT] [UNIQUE [KEY] | [PRIMARY] KEY] [COMMENT 'string'] [reference_definition]type: TINYINT[(length)] [UNSIGNED] [ZEROFILL] | SMALLINT[(length)] [UNSIGNED] [ZEROFILL] | MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL] | INT[(length)] [UNSIGNED] [ZEROFILL] | INTEGER[(length)] [UNSIGNED] [ZEROFILL] | BIGINT[(length)] [UNSIGNED] [ZEROFILL] | REAL[(length,decimals)] [UNSIGNED] [ZEROFILL] | DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL] | FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL] | DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL] | NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL] | DATE | TIME | TIMESTAMP | DATETIME | CHAR(length) [BINARY | ASCII | UNICODE] | VARCHAR(length) [BINARY] | TINYBLOB | BLOB | MEDIUMBLOB | LONGBLOB | TINYTEXT [BINARY] | TEXT [BINARY] | MEDIUMTEXT [BINARY] | LONGTEXT [BINARY] | ENUM(value1,value2,value3,...) | SET(value1,value2,value3,...) |spatial_typeindex_col_name:col_name[(length)] [ASC | DESC]reference_definition: REFERENCEStbl_name[(index_col_name,...)] [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE] [ON DELETEreference_option] [ON UPDATEreference_option]reference_option: RESTRICT | CASCADE | SET NULL | NO ACTIONtable_options:table_option[table_option] ...table_option: {ENGINE|TYPE} =engine_name| AUTO_INCREMENT =value| AVG_ROW_LENGTH =value| [DEFAULT] CHARACTER SETcharset_name[COLLATEcollation_name] | CHECKSUM = {0 | 1} | COMMENT = 'string' | CONNECTION = 'connect_string' | MAX_ROWS =value| MIN_ROWS =value| PACK_KEYS = {0 | 1 | DEFAULT} | PASSWORD = 'string' | DELAY_KEY_WRITE = {0 | 1} | ROW_FORMAT = {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT} | UNION = (tbl_name[,tbl_name]...) | INSERT_METHOD = { NO | FIRST | LAST } | DATA DIRECTORY = 'absolute path to directory' | INDEX DIRECTORY = 'absolute path to directory'select_statement:[IGNORE | REPLACE] [AS] SELECT ... (Some legal select statement)
CREATE TABLE 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 current database. An error occurs if the table exists, if there is no current 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 whether or not there is a
current database. If you use quoted identifiers, quote the
database and table names separately. For example,
`mydb`.`mytbl` is legal, but
`mydb.mytbl` is not.
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.)
You must have the CREATE TEMPORARY TABLES
privilege to be able to create temporary tables.
The keywords IF NOT EXISTS prevent an error
from occurring if the table exists. Note that 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 records selected by the SELECT
part are inserted whether or not 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 |
| Table format (definition) file |
| Data file |
| Index file |
The files created by each storage engine to represent tables are described in Chapter 14, Storage Engines and Table Types.
For general information on the properties of the various column types, see Chapter 11, Column Types. For information about spatial column types, see Chapter 16, Spatial Extensions in MySQL.
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
, where
value+1value is the largest value for
the column currently in the table.
AUTO_INCREMENT sequences begin with
1. Such a column must be defined as one
of the integer types as described in
Section 11.1.1, “Overview of Numeric Types”. (The value 1.0 is
not an integer.) See
Section 22.2.3.36, “mysql_insert_id()”.
Specifying the NO_AUTO_VALUE_ON_ZERO flag
for the --sql-mode server option or the
sql_mode system variable allows you to
store 0 in
AUTO_INCREMENT columns as
0 without generating a new sequence
value. See Section 5.3.1, “mysqld Command-Line Options”.
Note: There can be only one
AUTO_INCREMENT column per table, it must
be indexed, and it cannot have a DEFAULT
value. 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.
For MyISAM and BDB
tables, you can specify an AUTO_INCREMENT
secondary column in a multiple-column key. See
Section 3.6.9, “Using AUTO_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 * FROMtbl_nameWHEREauto_colIS NULL
Character column definitions can include a
CHARACTER SET attribute to specify the
character set and, optionally, a collation for the column.
For details, see Chapter 10, Character Set Support.
CHARSET is a synonym for
CHARACTER SET.
CREATE TABLE t (c CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin);
MySQL 5.0 interprets length specifications in character column definitions in characters. (Some earlier versions interpreted them 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
as NOW() or
CURRENT_DATE. The exception is that you
can specify CURRENT_TIMESTAMP as the
default for a TIMESTAMP column. See
Section 11.3.1.1, “TIMESTAMP Properties as of MySQL 4.1”.
Prior to MySQL 5.0.2, if a column definition includes no
explicit DEFAULT value, MySQL determines
the default value as follows:
If the column can take NULL as a value,
the column is defined with an explicit DEFAULT
NULL clause.
If the column cannot take NULL as the
value, MySQL defines the column with an explicit
DEFAULT clause, using the implicit
default value for the column data type. Implicit defaults
are defined as follows:
For numeric types other than those declared with the
AUTO_INCREMENT attribute, the default
is 0. For an
AUTO_INCREMENT column, the default
value is the next value in the sequence.
For date and time types other than
TIMESTAMP, the default is the
appropriate “zero” value for the type. For
the first TIMESTAMP column in a
table, the default value is the current date and time.
See Section 11.3, “Date and Time Types”.
For string types other than ENUM, the
default value is the empty string. For
ENUM, the default is the first
enumeration value.
BLOB and TEXT columns
cannot be assigned a default value.
As of MySQL 5.0.2, if a column definition includes no
explicit DEFAULT value, MySQL determines
the default value as follows:
If the column can take NULL as a value,
the column is defined with an explicit DEFAULT
NULL clause. This is the same as before 5.0.2.
If the column cannot take NULL as the
value, MySQL defines the column with no explicit
DEFAULT clause. For data entry, if an
INSERT or REPLACE
statement includes no value for the column, MySQL handles
the column according to the SQL mode in effect at the time:
If strict mode is not enabled, MySQL sets the column to the implicit default value for the column data type.
If strict mode is enabled, an error occurs for transactional tables and the statement is rolled back. For non-transactional tables, an error occurs, but if this happens for the the second or subsequent row of a multiple-row statement, the preceding rows will have been inserted.
Suppose that a table t is defined as
follows:
CREATE TABLE t (i INT NOT NULL);
In this case, i has no explicit default,
so in strict mode each of the following statements produce
an error and no row is inserted. When not using strict mode,
only the third statement produces an error; the implicit
default is inserted for the first two statements, but the
third fails because DEFAULT(i) cannot
produce a value:
INSERT INTO t VALUES(); INSERT INTO t VALUES(DEFAULT); INSERT INTO t VALUES(DEFAULT(i));
See Section 5.3.2, “The Server SQL Mode”.
For a given table, you can use the SHOW CREATE
TABLE statement to see which columns have an
explicit DEFAULT clause.
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.
The attribute SERIAL can be used as an
alias for BIGINT UNSIGNED NOT NULL AUTO_INCREMENT
UNIQUE.
KEY is normally a synonym for
INDEX. 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 is one in which all values
in the index must be distinct. An error occurs if you try to
add a new row with a key that matches an existing row. The
exception to this is that if a column in the index is
allowed to contain NULL values, it can
contain multiple NULL values. This
exception does not apply to BDB tables,
for which an indexed column allows only a single
NULL.
A PRIMARY KEY is a unique
KEY 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.
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
. See
Section 13.5.4.11, “tbl_nameSHOW INDEX Syntax”.
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;
For details about USING, see
Section 13.1.4, “CREATE INDEX Syntax”.
For more information about how MySQL uses indexes, see Section 7.4.5, “How MySQL Uses Indexes”.
In MySQL 5.0, only the
MyISAM, InnoDB,
BDB, and 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.
With
syntax in an index specification, you can create an index
that uses only the first col_name(length)length
characters of a CHAR or
VARCHAR column. Indexing only a prefix of
column values like this can make the index file much
smaller. See Section 7.4.3, “Column Indexes”.
The MyISAM and InnoDB
storage engines also support indexing on
BLOB and TEXT columns.
When indexing a BLOB or
TEXT column, you
must specify a prefix length for the
index. 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 in
CREATE TABLE statements is interpreted as
number of characters. Be sure to 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”.
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.
You can create SPATIAL indexes on spatial
column 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.
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. For the precise syntax, see
Section 14.2.6.4, “FOREIGN KEY Constraints”.
For other storage engines, MySQL Server parses the
FOREIGN KEY and
REFERENCES syntax in CREATE
TABLE statements, but without further action being
taken. The CHECK clause is parsed but
ignored by all storage engines. See
Section 1.8.5.5, “Foreign Keys”.
For MyISAM tables, each
NULL column takes one bit extra, rounded
up to the nearest byte. The maximum record 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 record 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 ENGINE and TYPE
options specify the storage engine for the table.
ENGINE is the preferred option name.
The ENGINE and TYPE
options take the following values:
| 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 | See Section 14.4, “The MEMORY (HEAP) Storage Engine”. |
(OBSOLETE) ISAM | 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. See
Chapter 14, Storage Engines and Table Types. |
InnoDB | Transaction-safe tables with row locking and foreign keys. See
Section 14.2, “The InnoDB Storage Engine”. |
MEMORY | The data for this table type is stored only in memory. (Known in earlier
MySQL versions as HEAP.) |
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. |
For more information about MySQL's storage engines, see Chapter 14, Storage Engines and Table Types.
If a storage engine is specified that is not available, MySQL
uses MyISAM instead. 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 work for all storage engines unless otherwise indicated:
AUTO_INCREMENT
The initial AUTO_INCREMENT value for the
table. In MySQL 5.0, this works for
MyISAM and MEMORY
tables. It is also supported for InnoDB
as of MySQL 5.0.3. 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 to
reset the tbl_name
AUTO_INCREMENT = nAUTO_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 records.
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 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
operating system 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 the
myisam_data_pointer_size system variable,
which was added in MySQL 4.1.2. (See
Section 5.3.3, “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 this.
for CHARACTER SET.
COLLATE
Specify a default collation for the table.
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).
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 a COMMENT option for the
connection string.
MAX_ROWS
The maximum number of rows you plan to store in the table. This is not a hard limit, but rather an indicator 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
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
(MyISAM only).
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 big 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 not do anything in the standard MySQL
version.
DELAY_KEY_WRITE
Set this to 1 if you want to delay key
updates for the table until the table is closed
(MyISAM only).
ROW_FORMAT
Defines how the rows should be stored. Currently this option
works only with MyISAM tables. The option
value can 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”.
Starting with MySQL/InnoDB-5.0.3, InnoDB
records 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 specifying
ROW_FORMAT=REDUNDANT.
RAID_TYPE
RAID support has been removed as of MySQL
5.0. For information on RAID, see
http://dev.mysql.com/doc/refman/4.1/en/create-table.html.
UNION
UNION is used when you want to use a
collection of identical tables as one. This works only with
MERGE tables. See
Section 14.3, “The MERGE Storage Engine”.
You must have SELECT,
UPDATE, and DELETE
privileges for the tables you map to a
MERGE table. (Note:
Formerly, all tables used had to be in the same database as
the MERGE table itself. This restriction
no longer applies.)
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. See Section 14.3, “The MERGE Storage Engine”.
DATA DIRECTORY, INDEX
DIRECTORY
By using DATA
DIRECTORY='
or directory'INDEX
DIRECTORY='
you can specify where the directory'MyISAM storage
engine should put a table's data file and index file. Note
that the directory should be a full path 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-safe
realpath() call. See
Section 7.6.1.2, “Using Symbolic Links for Tables on Unix” for more complete
information.
You can create one table from another by adding a
SELECT statement at the end of the
CREATE TABLE statement:
CREATE TABLEnew_tblSELECT * 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 column 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 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_tblLIKEorig_tbl;
CREATE TABLE ... LIKE does not copy 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 records that duplicate unique key values.
With IGNORE, new records that duplicate an
existing record on a unique key value are discarded. With
REPLACE, new records replace records 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/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 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.
Previous to MySQL 5.0.3, 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.
Starting with MySQL 5.0.3, a CHAR or
BINARY column with a length
specification greater than 255 is not silently converted.
Instead, an error occurs. From MySQL 5.0.6 on, silent
conversion of VARCHAR and
VARBINARY 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(,
if M,D)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.
Note that TIMESTAMP columns have
changed considerably in recent versions of MySQL prior to
5.0; for a description of these changes, see the
MySQL 4.1 Reference Manual.
Columns that are part of a PRIMARY KEY
are made NOT NULL even if not declared
that way.
Trailing spaces are automatically deleted from
ENUM and SET member
values when the table is created.
MySQL maps certain column types used by other SQL database vendors to MySQL types. See Section 11.7, “Using Column 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 column type other than the one you
specified, issue a DESCRIBE or
SHOW CREATE TABLE statement after creating
or altering the table.
Certain other column 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.
IF EXISTS is used to prevent an error from
occurring if the database does not exist.
DROP SCHEMA can be used as of MySQL 5.0.2.
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 | .ISD | |
.MYI | .db | .frm |
All subdirectories with names that consist of two hex digits
00-ff. These are
subdirectories used for RAID tables.
(These directories are not removed as of MySQL 5.0, when
support for RAID tables was removed. You
should convert any existing RAID tables
and remove these directories manually before upgrading to
MySQL 5.0. See Section 2.10.2, “Upgrading from Version 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.5, “mysqladmin — Client for Administering a MySQL Server”.
DROP INDEXindex_nameONtbl_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!
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.22, “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_nameTOnew_tbl_name[,tbl_name2TOnew_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:
CREATE TABLEnew_table(...); RENAME TABLEold_tableTObackup_table,new_tableTOold_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 no table
named tmp_table already exists):
RENAME TABLEold_tableTOtmp_table,new_tableTOold_table,tmp_tableTOnew_table;
As long as two databases are on the same filesystem you can also rename a table to move it from one database to another:
RENAME TABLEcurrent_db.tbl_nameTOother_db.tbl_name;
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.
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.