:: DEVELOPER ZONE
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 API
mysql_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 строки,
превосходящей максимальную длину столбца. Данная величина усекается до
максимальной длины столбца.
Внесение в столбец даты или времени строки, недопустимой для данного типа столбца. Этот столбец устанавливается в нулевую величину, соответствующую данному типу.
© 1995-2005 MySQL AB. All rights reserved.
