INSERT
Contents
Syntax
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [PARTITION (partition_list)] [(col_name,...)] {VALUES | VALUE} ({expr | DEFAULT},...),(...),... [ ON DUPLICATE KEY UPDATE col_name=expr [, col_name=expr] ... ]
Or:
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [PARTITION (partition_list)] SET col_name={expr | DEFAULT}, ... [ ON DUPLICATE KEY UPDATE col_name=expr [, col_name=expr] ... ]
Or:
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE] [INTO] tbl_name [PARTITION (partition_list)] [(col_name,...)] SELECT ... [ ON DUPLICATE KEY UPDATE col_name=expr [, col_name=expr] ... ]
Description
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. INSERT ... SELECT
is discussed further in the
INSERT ... SELECT
article.
The table name can be specified in the form db_name
.tbl_name
or, if a default database is selected, in the form tbl_name
(see Identifier Qualifiers). This allows to use INSERT ... SELECT to copy rows between different databases.
MariaDB starting with 10.0
The PARTITION clause was introduced in MariaDB 10.0. It can be used in both the INSERT and the SELECT part. See for Partition Pruning and Selection details.
The columns list is optional. It specifies which values are explicitly inserted, and in which order. If this clause is not specified, all values must be explicitly specified, in the same order they are listed in the table definition.
The list of value follow the VALUES
or VALUE
keyword (which are interchangeable, regardless how much values you want to insert), and is wrapped by parenthesis. The values must be listed in the same order as the columns list. It is possible to specify more than one list to insert more than one rows with a single statement. If many rows are inserted, this is a speed optimization.
For one-row statements, the SET
clause may be more simple, because you don't need to remember the columns order. All values are specified in the form col_name
= expr
.
Values can also be specified in the form of a SQL expression or subquery. However, the subquery cannot access the same table that is named in the INTO
clause.
If you use the LOW_PRIORITY
keyword, execution of the INSERT
is delayed until no other clients are reading from the table. If you use the HIGH_PRIORITY
keyword, the statement has the same priority as SELECT
s. This affects only storage engines that use only table-level locking (MyISAM, MEMORY, MERGE). However, if one of these keywords is specified, concurrent inserts cannot be used. See HIGH_PRIORITY and LOW_PRIORITY clauses for details.
For more details on the DELAYED
option, see INSERT DELAYED
.
Default values
If the SQL_MODE
contains STRICT_TRANS_TABLES
and you are inserting into a transactional table (like InnoDB), or if the SQL_MODE contains STRICT_ALL_TABLES
, all NOT NULL
columns which does not have a DEFAULT
value (and is not AUTO_INCREMENT) must be explicitly referenced in INSERT
statements. If not, an error like this is produced:
ERROR 1364 (HY000): Field 'col_name' doesn't have a default value
In all other cases, if a NOT NULL
column without a DEFAULT
value is not referenced, an empty value will be inserted (for example, 0 for INTEGER
columns and '' for CHAR
columns). See NULL Values in MariaDB:Inserting for examples.
If a NOT NULL
column having a DEFAULT
value is not referenced, NULL
will be inserted.
If a NULL
column having a DEFAULT
value is not referenced, its default value will be inserted. It is also possible to explicitly assign the default value using the DEFAULT
keyword or the DEFAULT()
function.
If the DEFAULT
keyword is used but the column does not have a DEFAULT
value, an error like this is produced:
ERROR 1364 (HY000): Field 'col_name' doesn't have a default value
Duplicate values
By default, if you try to insert a duplicate row and there is a UNIQUE
index, INSERT
stops and an error like this is produced:
ERROR 1062 (23000): Duplicate entry 'dup_value' for key 'col_name'
To handle duplicates you can use the IGNORE
clause, INSERT ON DUPLICATE KEY UPDATE
or the REPLACE
statement.
Ignoring errors
Normally INSERT
stops and rolls back when it encounters an error.
By using the IGNORE keyword all errors are converted to warnings, which will not stop inserts of additional rows.
Examples
How to specify the column names:
INSERT INTO person (first_name, last_name) VALUES ('John', 'Doe');
How to insert more than 1 row at a time:
INSERT INTO tbl_name VALUES (1, "row 1"), (2, "row 2");
Using the SET
clause:
INSERT INTO person SET first_name = 'John', last_name = 'Doe';
See INSERT ON DUPLICATE KEY UPDATE for further examples using that syntax.
Incompatibilities
MariaDB until 5.5.28
- MySQL and MariaDB before 5.5.28 didn't give warnings for duplicate key errors when using
IGNORE
. You can get the old behaviour if you set OLD_MODE toNO_DUP_KEY_WARNINGS_WITH_IGNORE