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
строки, превосходящей
максимальную длину столбца.
Данная величина усекается до
максимальной длины столбца.
Внесение в столбец даты или времени строки, недопустимой для данного типа столбца. Этот столбец устанавливается в нулевую величину, соответствующую данному типу.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.
© 1995-2005 MySQL AB. All rights reserved.
