INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] tbl_name [(col_name,...)] VALUES (expression,...),(...),... [ ON DUPLICATE KEY UPDATE col_name=expression, ... ] или INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] tbl_name [(col_name,...)] SELECT ... или INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] tbl_name SET col_name=(expression | DEFAULT), ... [ ON DUPLICATE KEY UPDATE col_name=expression, ... ]
Оператор INSERT
вставляет новые строки в существующую таблицу. Форма
данной команды INSERT ... VALUES
вставляет строки в соответствии с точно
указанными в команде значениями. Форма INSERT ... SELECT
вставляет строки,
выбранные из другой таблицы или таблиц. Форма INSERT ... VALUES
со списком
из нескольких значений поддерживается в версии MySQL 3.22.5 и более
поздних. Синтаксис выражения col_name=expression
поддерживается в версии
MySQL 3.22.10 и более поздних.
tbl_name
задает таблицу, в которую должны быть внесены строки. Столбцы,
для которых заданы величины в команде, указываются в списке имен столбцов
или в части SET
:
Если не указан список столбцов для
INSERT ... VALUES
илиINSERT ... SELECT
, то величины для всех столбцов должны быть определены в спискеVALUES()
или в результате работыSELECT
. Если порядок столбцов в таблице неизвестен, для его получения можно использоватьDESCRIBE tbl_name
.-
Любой столбец, для которого явно не указано значение, будет установлен в свое значение по умолчанию. Например, если в заданном списке столбцов не указаны все столбцы в данной таблице, то не упомянутые столбцы устанавливаются в свои значения по умолчанию. Установка значений по умолчанию описывается в разделе Раздел 6.5.3, «Синтаксис оператора
CREATE TABLE
».Вы также можете использовать ключевое слово
DEFAULT
для того, чтобы установить столбец в его значение по умолчанию (новшество в MySQL 4.0.3). Это облегчает написаниеINSERT
, присвающим значения всем, за исключением одного-двух, столбцам, т.к. такой ситнаксис позволяет вам обойтись без указания списка столбцов, которые операторINSERT
должен обновить.В MySQL всегда предусмотрено значение по умолчанию для каждого поля. Это требование ``навязано'' MySQL, чтобы обеспечить возможность работы как с таблицами, поддерживающими транзакции, так и с таблицами, не поддерживающими их.
Наша точка зрения (разработчиков) состоит в том, что проверка содержимого полей должна производиться приложением, а не сервером баз данных.
-
Выражение
expression
может относится к любому столбцу, который ранее был внесен в список значений. Например, можно указать следующее:mysql> INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2);
Но нельзя указать:
mysql> INSERT INTO tbl_name (col1,col2) VALUES(col2*2,15);
Если указывается ключевое слово
LOW_PRIORITY
, то выполнение данной командыINSERT
будет задержано до тех пор, пока другие клиенты не завершат чтение этой таблицы. В этом случае данный клиент должен ожидать, пока данная команда вставки не будет завершена, что в случае интенсивного использования таблицы может потребовать значительного времени. В противоположность этому командаINSERT DELAYED
позволяет данному клиенту продолжать операцию сразу же. See Раздел 6.4.4, «Синтаксис оператораINSERT DELAYED
». Следует отметить, что указательLOW_PRIORITY
обычно не используется с таблицамиMyISAM
, поскольку при его указании становятся невозможными параллельные вставки. See Раздел 7.1, «ТаблицыMyISAM
».Если в команде
INSERT
со строками, имеющими много значений, указывается ключевое словоIGNORE
, то все строки, имеющие дублирующиеся ключиPRIMARY
илиUNIQUE
в этой таблице, будут проигнорированы и не будут внесены. Если не указыватьIGNORE
, то данная операция вставки прекращается при обнаружении строки, имеющей дублирующееся значение существующего ключа. Количество строк, внесенных в данную таблицу, можно определить при помощи функции C APImysql_info()
.-
Если вы указываете
ON DUPLICATE KEY UPDATE
(новшество в MySQL 4.1.0), и производится вставка строки, которая вызывает ошибку дублирующегося первичного (PRIMARY
) или уникального (UNIQUE
) ключа, то вполняетсяUPDATE
старой строки.Например:
mysql> INSERT INTO table (a,b,c) VALUES (1,2,3) --> ON DUPLICATE KEY UPDATE c=c+1;
Если
a
определяется какUNIQUE
и уже содержит1
, то тогда вышеуказанная команда будет аналогична следующей:mysql> UPDATE table SET c=c+1 WHERE a=1;
Внимание: если столбец
b
также является уникальным ключем, тоUPDATE
переписывается как:mysql> UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;
и если несколько записей соответствуют
a=1 OR b=2
только одна запись будет обновлена! В общем случае, следует избегать использованияON DUPLICATE KEY
на таблицах со множеством уникальных (UNIQUE
) ключей.Когда используется
ON DUPLICATE KEY UPDATE
, опцияDELAYED
будет проигнорирована. Если MySQL был сконфигурирован с использованием опции
DONT_USE_DEFAULT_FIELDS
, то командаINSERT
будет генерировать ошибку, если явно не указать величины для всех столбцов, которые требуют значений не-NULL
. See Раздел 2.3.3, «Типичные опцииconfigure
».С помощью функции
mysql_insert_id
можно найти величину, использованную для столбцаAUTO_INCREMENT
. See Раздел 8.4.3.31, «mysql_insert_id()
».
Если задается команда INSERT ... SELECT
или INSERT ... VALUES
со списками
из нескольких значений, то для получения информации о данном запросе можно
использовать функцию C API mysql_info()
. Формат этой информационной строки
приведен ниже:
Records: 100 Duplicates: 0 Warnings: 0
Duplicates
показывает число строк, которые не могли быть внесены,
поскольку они дублировали бы значения некоторых существующих уникальных
индексов. Указатель Warnings
показывает число попыток внести величину в
столбец, который по какой-либо причине оказался проблематичным.
Предупреждения возникают при выполнении любого из следующих условий:
Внесение
NULL
в столбец, который был объявлен, какNOT NULL
. Данный столбец устанавливается в значение, заданное по умолчанию.Установка числового столбца в значение, лежащее за пределами его допустимого диапазона. Данная величина усекается до соответствующей конечной точки этого диапазона.
Занесение в числовой столбец такой величины, как
'10.34 a'
. Конечные данные удаляются и вносится только оставшаяся числовая часть. Если величина вовсе не имеет смысла как число, то столбец устанавливается в0
.Внесение в столбцы типа
CHAR
,VARCHAR
,TEXT
илиBLOB
строки, превосходящей максимальную длину столбца. Данная величина усекается до максимальной длины столбца.Внесение в столбец даты или времени строки, недопустимой для данного типа столбца. Этот столбец устанавливается в нулевую величину, соответствующую данному типу.