(mysql.info.gz) INSERT
Info Catalog
(mysql.info.gz) HANDLER
(mysql.info.gz) Data Manipulation
(mysql.info.gz) LOAD DATA
13.1.4 `INSERT' Syntax
----------------------
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] TBL_NAME [(COL_NAME,...)]
VALUES ({EXPR | DEFAULT},...),(...),...
[ ON DUPLICATE KEY UPDATE COL_NAME=EXPR, ... ]
Or:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] TBL_NAME
SET COL_NAME={EXPR | DEFAULT}, ...
[ ON DUPLICATE KEY UPDATE COL_NAME=EXPR, ... ]
Or:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] TBL_NAME [(COL_NAME,...)]
SELECT ...
[ ON DUPLICATE KEY UPDATE COL_NAME=EXPR, ... ]
`INSERT' inserts new rows into an existing table. The `INSERT ...
VALUES' and `INSERT ... SET' forms of the statement insert rows based
on explicitly specified values. The `INSERT ... SELECT' form inserts
rows selected from another table or tables. The `INSERT ... VALUES'
form with multiple value lists is supported in MySQL 3.22.5 or later.
The `INSERT ... SET' syntax is supported in MySQL 3.22.10 or later.
`INSERT ... SELECT' is discussed further in `INSERT SELECT'
INSERT SELECT.
TBL_NAME is the table into which rows should be inserted. The columns
for which the statement provides values can be specified as follows:
* The column name list or the `SET' clause indicates the columns
explicitly.
* If you do not specify the column list for `INSERT ... VALUES' or
`INSERT ... SELECT', values for every column in the table must be
provided in the `VALUES()' list or by the `SELECT'. If you don't
know the order of the columns in the table, use `DESCRIBE
TBL_NAME' to find out.
Column values can be given in several ways:
* If you are not running in strict mode, any column not explicitly
given a value is set to its default (explicit or implicit) value.
For example, if you specify a column list that doesn't name all
the columns in the table, unnamed columns are set to their default
values. Default value assignment is described in `CREATE
TABLE' CREATE TABLE. constraint invalid data.
If you want `INSERT' statements to generate an error unless you
explicitly specify values for all columns that don't have a default
value, you should use STRICT mode. Server SQL mode.
* You can use the keyword `DEFAULT' to explicitly set a column to its
default value. (New in MySQL 4.0.3.) This makes it easier to write
`INSERT' statements that assign values to all but a few columns,
because it allows you to avoid writing an incomplete `VALUES' list
that does not include a value for each column in the table.
Otherwise, you would have to write out the list of column names
corresponding to each value in the `VALUES' list.
As of MySQL 4.1.0, you can use `DEFAULT(COL_NAME)' as a more
general form that can be used in expressions to produce a column's
default value.
* If both the column list and the `VALUES' list are empty, `INSERT'
creates a row with each column set to its default value:
mysql> INSERT INTO TBL_NAME () VALUES();
* You can specify an expression EXPR to provide a column value.
This might involve type conversion if the type of the expression
does not match the type of the column, and conversion of a given
value can result in different inserted values depending on the
column type. For example, inserting the string `'1999.0e-2'' into
an `INT', `FLOAT', `DECIMAL(10,6)', or `YEAR' column results in
the values `1999', `19.9921', `19.992100', and `1999'. The reason
the value stored in the `INT' and `YEAR' columns is `1999' is that
the string-to-integer conversion looks only at as much of the
initial part of the string as may be considered a valid integer or
year. For the floating-point and fixed-point columns, the
string-to-floating-point conversion considers the entire string as
a valid floating-point value.
An expression EXPR can refer to any column that was set earlier in
a value list. For example, you can do this because the value for
`col2' refers to `col1', which has previously been assigned:
mysql> INSERT INTO TBL_NAME (COL1,COL2) VALUES(15,COL1*2);
But you cannot do this because the value for `col1' refers to
`col2', which is assigned after `col1':
mysql> INSERT INTO TBL_NAME (COL1,COL2) VALUES(COL2*2,15);
One exception involves columns that contain `AUTO_INCREMENT'
values. Because the AUTO_INCREMENT value is generated after other
value assignments, any reference to an AUTO_INCREMENT column in
the assignment will return a 0.
The `INSERT' statement supports the following modifiers:
* If you specify the `DELAYED' keyword, the server puts the row or
rows to be inserted into a buffer, and the client issuing the
`INSERT DELAYED' statement then can continue on. If the table is
busy, the server holds the rows. When the table becomes free, it
begins inserting rows, checking periodically to see whether there
are new read requests for the table. If there are, the delayed row
queue is suspended until the table becomes free again.
`INSERT DELAYED' INSERT DELAYED. `DELAYED' was added in MySQL
3.22.5.
* If you specify the `LOW_PRIORITY' keyword, execution of the
`INSERT' is delayed until no other clients are reading from the
table. This includes other clients that began reading while
existing clients are reading, and while the `INSERT LOW_PRIORITY'
statement is waiting. It is possible, therefore, for a client that
issues an `INSERT LOW_PRIORITY' statement to wait for a very long
time (or even forever) in a read-heavy environment. (This is in
contrast to `INSERT DELAYED', which lets the client continue at
once.) `INSERT DELAYED' INSERT DELAYED. Note that
`LOW_PRIORITY' should normally not be used with `MyISAM' tables
because doing so disables concurrent inserts. `MyISAM'
storage engine MyISAM storage engine. `LOW_PRIORITY' was added
in MySQL 3.22.5.
* If you specify the `HIGH_PRIORITY' keyword, it overrides the
effect of the `--low-priority-updates' option if the server was
started with that option. It also causes concurrent inserts not to
be used. `HIGH_PRIORITY' was added in MySQL 3.23.11.
* The rows-affected value for an `INSERT' can be obtained using the
`mysql_affected_rows()' C API function.
`mysql_affected_rows()' mysql_affected_rows.
* If you specify the `IGNORE' keyword in an `INSERT' statement,
errors that occur while executing the statement are treated as
warnings instead. For example, without `IGNORE', a row that
duplicates an existing `UNIQUE' index or `PRIMARY KEY' value in
the table causes a duplicate-key error and the statement is
aborted. With `IGNORE', the error is ignored and the row is not
inserted. Data conversions that would trigger errors abort the
statement if `IGNORE' is not specified. With `IGNORE', invalid
values are adjusted to the closest value values and inserted;
warnings are produced but the statement does not abort. You can
determine with the `mysql_info()' C API function how many rows
were inserted into the table.
If you specify the `ON DUPLICATE KEY UPDATE' clause (new in MySQL
4.1.0), and a row is inserted that would cause a duplicate value in a
`UNIQUE' index or `PRIMARY KEY', an `UPDATE' of the old row is
performed. For example, if column `a' is declared as `UNIQUE' and
contains the value `1', the following two statements have identical
effect:
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)
-> ON DUPLICATE KEY UPDATE c=c+1;
mysql> UPDATE table SET c=c+1 WHERE a=1;
The rows-affected value is 1 if the row is inserted as a new record and
2 if an existing record is updated.
* If column `b' is unique too, the `INSERT' would be equivalent
to this `UPDATE' statement instead:
mysql> UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
If `a=1 OR b=2' matches several rows, only _one_ row is updated! In
general, you should try to avoid using the `ON DUPLICATE KEY' clause on
tables with multiple `UNIQUE' keys.
As of MySQL 4.1.1, you can use the `VALUES(col_name)' function in the
`UPDATE' clause to refer to column values from the `INSERT' part of the
`INSERT ... UPDATE' statement. In other words, `VALUES(col_name)' in
the `UPDATE' clause refers to the value of COL_NAME that would be
inserted if no duplicate-key conflict occurred. This function is
especially useful in multiple-row inserts. The `VALUES()' function is
meaningful only in `INSERT ... UPDATE' statements and returns `NULL'
otherwise.
Example:
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)
-> ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
That statement is identical to the following two statements:
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3)
-> ON DUPLICATE KEY UPDATE c=3;
mysql> INSERT INTO table (a,b,c) VALUES (4,5,6)
-> ON DUPLICATE KEY UPDATE c=9;
When you use `ON DUPLICATE KEY UPDATE', the `DELAYED' option is ignored.
You can find the value used for an `AUTO_INCREMENT' column by using the
`LAST_INSERT_ID()' function. From within the C API, use the
`mysql_insert_id()' function. However, note that the two functions do
not behave quite identically under all circumstances. The behavior of
`INSERT' statements with respect to `AUTO_INCREMENT' columns is
discussed further in Information functions and
`mysql_insert_id()' mysql_insert_id.
If you use an `INSERT ... VALUES' statement with multiple value lists
or `INSERT ... SELECT', the statement returns an information string in
this format:
Records: 100 Duplicates: 0 Warnings: 0
`Records' indicates the number of rows processed by the statement.
(This is not necessarily the number of rows actually inserted.
`Duplicates' can be non-zero.) `Duplicates' indicates the number of
rows that couldn't be inserted because they would duplicate some
existing unique index value. `Warnings' indicates the number of
attempts to insert column values that were problematic in some way.
Warnings can occur under any of the following conditions:
* Inserting `NULL' into a column that has been declared `NOT NULL'.
For multiple-row `INSERT' statements or `INSERT ... SELECT'
statements, the column is set to the default value appropriate for
the column type. This is `0' for numeric types, the empty string
(`''') for string types, and the "zero" value for date and time
types.
* Setting a numeric column to a value that lies outside the column's
range. The value is clipped to the closest endpoint of the range.
* Assigning a value such as `'10.34 a'' to a numeric column. The
trailing non-numeric text is stripped off and the remaining
numeric part is inserted. If the string value has no leading
numeric part, the column is set to `0'.
* Inserting a string into a string column (`CHAR', `VARCHAR',
`TEXT', or `BLOB') that exceeds the column's maximum length. The
value is truncated to the column's maximum length.
* Inserting a value into a date or time column that is illegal for
the column type. The column is set to the appropriate zero value
for the type.
If you are using the C API, the information string can be obtained by
invoking the `mysql_info()' function. `mysql_info()' mysql_info.
Menu
* INSERT SELECT `INSERT ... SELECT' Syntax
* INSERT DELAYED `INSERT DELAYED' Syntax
Info Catalog
(mysql.info.gz) HANDLER
(mysql.info.gz) Data Manipulation
(mysql.info.gz) LOAD DATA
automatically generated byinfo2html