Если не указан список столбцов для INSERT ... VALUES
или INSERT ... SELECT
, то величины для всех столбцов должны быть определены в списке VALUES()
или в результате работы SELECT
. Если порядок столбцов в таблице неизвестен, для его получения можно использовать DESCRIBE tbl_name
.
Любой столбец, для которого явно не указано значение, будет установлен в свое значение по умолчанию. Например, если в заданном списке столбцов не указаны все столбцы в данной таблице, то не упомянутые столбцы устанавливаются в свои значения по умолчанию. Установка значений по умолчанию описывается в разделе «Синтаксис оператора 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
позволяет данному клиенту продолжать операцию сразу же. «Синтаксис оператора INSERT DELAYED
». Следует отметить, что указатель LOW_PRIORITY
обычно не используется с таблицами MyISAM
, поскольку при его указании становятся невозможными параллельные вставки. «Таблицы 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
. «Типичные опции configure
».
С помощью функции mysql_insert_id
можно найти величину, использованную для столбца AUTO_INCREMENT
. «mysql_insert_id()
».