13.2.5 Оператор INSERT
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[(col_name [, col_name] ...)]
{VALUES | VALUE} (value_list) [, (value_list)] ...
[ON DUPLICATE KEY UPDATE assignment_list]
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
[PARTITION (partition_name [, partition_name] ...)]
SET assignment_list
[ON DUPLICATE KEY UPDATE assignment_list]
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[(col_name [, col_name] ...)]
SELECT ...
[ON DUPLICATE KEY UPDATE assignment_list]
value:
{expr | DEFAULT}
value_list:
value [, value] ...
assignment:
col_name = value
assignment_list:
assignment [, assignment] ...
INSERT добавляет новые строки в существующую таблицу. INSERT
... VALUES и INSERT ... SET формы оператора добавляют строки на основе явно указанных значений. INSERT
... SELECT форма добавляет строки, выбранные из другой таблицы или таблиц. INSERT с клаузой ON DUPLICATE KEY UPDATE позволяет обновлять существующие строки, если вставка строки приведет к дублированию значения в индексе UNIQUE или PRIMARY
KEY.
Дополнительную информацию об INSERT ...
SELECT и INSERT ... ON
DUPLICATE KEY UPDATE см. в разделе 13.2.5.1 «Оператор INSERT ... SELECT» и разделе 13.2.5.2 «Оператор INSERT ... ON DUPLICATE KEY UPDATE».
В MySQL 5.7 ключевое слово DELAYED принимается, но игнорируется сервером. Причины этого см. в разделе 13.2.5.3 «Оператор INSERT DELAYED».
Для вставки в таблицу требуется привилегия INSERT для этой таблицы. Если используется клауза ON DUPLICATE KEY UPDATE и дублирование ключа приводит к выполнению UPDATE вместо этого, требуется привилегия UPDATE для столбцов, которые необходимо обновить. Для столбцов, которые читаются, но не изменяются, требуется только привилегия SELECT (например, для столбца, упоминаемого только в правой части присваивания col_name=expr в клаузе ON DUPLICATE KEY UPDATE).
При вставке в партиционированную таблицу вы можете управлять тем, какие разделы и подразделы принимают новые строки. Клауза PARTITION принимает список разделов или подразделов таблицы, разделенных запятыми. Если какие-либо из строк, которые должны быть вставлены оператором INSERT, не соответствуют перечисленным разделам, оператор INSERT завершается с ошибкой Найдена строка, не соответствующая заданному набору разделов. Более подробную информацию и примеры см. в разделе 22.5 «Выбор раздела».
tbl_name — это таблица, в которую должны быть вставлены строки. Укажите столбцы, для которых оператор предоставляет значения следующим образом:
Укажите список имен столбцов в скобках после имени таблицы. В этом случае значение для каждого указанного столбца должно быть предоставлено списком
VALUESили операторомSELECT.Если вы не указываете список имен столбцов для
INSERT ... VALUESилиINSERT ... SELECT, значения для каждого столбца таблицы должны быть предоставлены спискомVALUESили операторомSELECT. Если вы не знаете порядок столбцов в таблице, используйтеDESCRIBE, чтобы узнать его.tbl_nameКлауза
SETявно указывает столбцы по имени и значения, которые нужно им присвоить.
Значения столбцов можно задать несколькими способами:
-
Если режим строгой SQL не включен, любой столбец, для которого явно не указано значение, устанавливается в свое значение по умолчанию (явное или неявное). Например, если вы указываете список столбцов, который не содержит все столбцы таблицы, неименованные столбцы устанавливаются в свои значения по умолчанию. Назначение значений по умолчанию описано в разделе 11.6 «Значения по умолчанию типов данных». См. также раздел 1.6.3.3 «Ограничения на некорректные данные».
Если режим строгой SQL включен, оператор
INSERTгенерирует ошибку, если он не указывает явное значение для каждого столбца, не имеющего значения по умолчанию. См. раздел 5.1.10 «Режим SQL сервера». -
Если и список столбцов, и список
VALUESпусты,INSERTсоздаёт строку, устанавливая каждый столбец в свое значение по умолчанию:INSERT INTO
tbl_name() VALUES();Если режим строгой SQL не включён, MySQL использует неявное значение по умолчанию для любого столбца, для которого явно не определено значение по умолчанию. Если режим строгой SQL включен, возникает ошибка, если у любого столбца нет значения по умолчанию.
Используйте ключевое слово
DEFAULT, чтобы явно установить столбец в его значение по умолчанию. Это упрощает написание операторовINSERT, которые присваивают значения всем, кроме нескольких столбцов, так как это позволяет избежать написания неполного спискаVALUES, который не включает значение для каждого столбца в таблице. В противном случае вам нужно предоставить список имен столбцов, соответствующих каждому значению в спискеVALUES.-
Если вставляется сгенерированный столбец, единственно допустимое значение —
DEFAULT. Подробности о сгенерированных столбцах см. в разделе 13.1.18.7 «CREATE TABLE и сгенерированные столбцы». В выражениях можно использовать
DEFAULT(для получения значения по умолчанию для столбцаcol_name)col_name.Приведение типов выражения
expr, предоставляющего значение столбца, может произойти, если тип данных выражения не совпадает с типом данных столбца. Преобразование заданного значения может привести к разным вставленным значениям в зависимости от типа столбца. Например, вставка строки'1999.0e-2'в столбец типаINT,FLOAT,DECIMAL(10,6)илиYEARвставляет значение1999,19.9921,19.992100или1999соответственно. Значение, хранимое в столбцахINTиYEAR, равно1999, поскольку преобразование строки в число рассматривает только начальную часть строки, которая может считаться допустимым целым числом или годом. Для столбцовFLOATиDECIMALпреобразование строки в число рассматривает всю строку как допустимое числовое значение.-
Выражение
exprможет ссылаться на любой столбец, который был задан ранее в списке значений. Например, вы можете это сделать, так как значение дляcol2относится кcol1, которому ранее было присвоено значение:Однако следующее не является допустимым, поскольку значение дляINSERT INTO
tbl_name(col1,col2) VALUES(15,col1*2);col1ссылается наcol2, которому присвоено значение послеcol1:Исключение происходит для столбцов, содержащихINSERT INTO
tbl_name(col1,col2) VALUES(col2*2,15);AUTO_INCREMENTзначения. Поскольку значенияAUTO_INCREMENTгенерируются после других назначений значений, любая ссылка на столбецAUTO_INCREMENTв присваивании возвращает0.
Операторы INSERT, использующие синтаксис VALUES, могут вставлять несколько строк. Для этого включите несколько списков значений столбцов, заключённых в скобки и разделенных запятыми. Пример:
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
Каждый список значений должен содержать ровно столько значений, сколько должно быть вставлено в строке. Следующий оператор недействителен, так как он содержит один список из девяти значений, а не три списка из трёх значений каждый:
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3,4,5,6,7,8,9);
VALUE является синонимом для VALUES в данном контексте. Ни один из них не подразумевает ничего о количестве списков значений или количестве значений в каждом списке. Оба можно использовать как для одного списка значений, так и для нескольких, независимо от количества значений в каждом списке.
Значение affected-rows для оператора INSERT можно получить, используя SQL-функцию ROW_COUNT() или функцию C API. См. Раздел 12.15, «Функции информации», и .
Если вы используете оператор INSERT ...
VALUES с несколькими списками значений или оператор INSERT ...
SELECT, оператор возвращает строку информации в этом формате:
Records: N1 Duplicates: N2 Warnings: N3
Если вы используете C API, строку информации можно получить, вызвав функцию . См. .
Records указывает количество обработанных строк оператором. (Это не обязательно количество фактически вставленных строк, так как Duplicates может быть ненулевым.) Duplicates указывает количество строк, которые не могли быть вставлены, потому что они дублируют значение какого-либо существующего уникального индекса. Warnings указывает количество попыток вставки значений столбцов, которые были проблемными. Предупреждения могут возникать при следующих условиях:
Вставка
NULLв столбец, который объявленNOT NULL. Для операторовINSERTс несколькими строками или операторовINSERT INTO ... SELECTстолбец устанавливается в неявное значение по умолчанию для типа данных столбца. Это0для числовых типов, пустая строка ('') для строковых типов и значение “ноль” для типов даты и времени.INSERT INTO ... SELECTобрабатываются так же, как операции вставки с несколькими строками, так как сервер не проверяет результат набора из оператораSELECT, чтобы увидеть, возвращает ли он одну строку. (Для оператораINSERTс одной строкой предупреждение не возникает, когдаNULLвставляется в столбецNOT NULL. Вместо этого оператор завершается ошибкой.)Установка числового столбца на значение, выходящее за пределы диапазона столбца. Значение обрезается до ближайшей грани диапазона.
Присвоение значения, такого как
'10.34 a', числовому столбцу. Конечный нечисловой текст удаляется, и оставшаяся числовая часть вставляется. Если строковое значение не имеет начальной числовой части, столбец устанавливается в0.Вставка строки в строковый столбец (
CHAR,VARCHAR,TEXTилиBLOB), которая превышает максимальную длину столбца. Значение усекается до максимальной длины столбца.Вставка значения в столбец даты или времени, которое является недопустимым для типа данных. Столбец устанавливается на соответствующее нулевое значение для типа.
-
Примеры операторов
INSERTс участием значений столбцовAUTO_INCREMENTсм. в Разделе 3.6.9, «Использование AUTO_INCREMENT».Если
INSERTвставляет строку в таблицу, имеющую столбецAUTO_INCREMENT, вы можете найти значение, используемое для этого столбца, используя SQL-функциюLAST_INSERT_ID()или функцию C API.ПримечаниеЭти две функции не всегда ведут себя идентично. Поведение операторов
INSERTпо отношению к столбцамAUTO_INCREMENTболее подробно описано в Разделе 12.15, «Функции информации», и .
Оператор INSERT поддерживает следующие модификаторы:
-
Если вы используете модификатор
LOW_PRIORITY, выполнение оператораINSERTоткладывается до тех пор, пока другие клиенты не прекратят чтение из таблицы. Это включает в себя других клиентов, которые начали чтение, пока существующие клиенты читают, и пока операторINSERT LOW_PRIORITYожидает. Следовательно, возможно, что клиент, который выполняет операторINSERT LOW_PRIORITY, будет ждать очень долго.LOW_PRIORITYвлияет только на движки хранения, которые используют только блокировку на уровне таблицы (например,MyISAM,MEMORYиMERGE).ПримечаниеLOW_PRIORITYобычно не следует использовать с таблицамиMyISAM, потому что это отключает одновременные вставки. См. Раздел 8.11.3, «Одновременные вставки». -
Если вы укажете
HIGH_PRIORITY, это переопределит эффект параметра--low-priority-updates, если сервер был запущен с этим параметром. Это также приведет к тому, что одновременные вставки не будут использоваться. См. Раздел 8.11.3, «Одновременные вставки».HIGH_PRIORITYвлияет только на движки хранения, которые используют только блокировку на уровне таблицы (например,MyISAM,MEMORYиMERGE). -
Если вы используете модификатор
IGNORE, игнорируются ошибки, которые могут возникнуть во время выполнения оператораINSERT. Например, безIGNOREстрока, дублирующая существующий индексUNIQUEили значениеPRIMARY KEYв таблице, вызывает ошибку дублирующего ключа, и оператор прерывается. СIGNOREстрока отбрасывается, и ошибка не возникает. Игнорируемые ошибки генерируют предупреждения вместо этого.IGNOREоказывает аналогичное влияние на вставки в разбиение таблиц, где не найдена разбиение, соответствующая заданному значению. БезIGNOREтакие операторыINSERTпрерываются с ошибкой. Когда используетсяINSERT IGNORE, операция вставки безмолвно завершается для строк, содержащих несовпадающее значение, но вставляет строки, которые соответствуют. Пример см. в Разделе 22.2.2, «Разбиение LIST».Преобразования данных, которые вызовут ошибки, прервут оператор, если не указано
IGNORE. СIGNOREнедопустимые значения корректируются до ближайших значений и вставляются; генерируются предупреждения, но оператор не прерывается. С помощью функции C API можно определить, сколько строк фактически было вставлено в таблицу.Дополнительную информацию см. в Разделе «Влияние IGNORE на выполнение оператора».
Можно использовать
REPLACEвместоINSERTдля перезаписи старых строк.REPLACEявляется аналогомINSERT IGNOREпри обработке новых строк, содержащих уникальные значения ключей, которые дублируют старые строки: новые строки заменяют старые, а не отбрасываются. См. Раздел 13.2.8, «Оператор REPLACE». -
Если вы укажете
ON DUPLICATE KEY UPDATE, и строка вставляется, что приведет к дублированию значения в индексеUNIQUEилиPRIMARY KEY, происходит обновлениеUPDATEстарой строки. Значение affected-rows на строку равно 1, если строка вставляется как новая строка, 2, если существующая строка обновляется, и 0, если существующая строка устанавливается в текущие значения. Если вы укажете флагCLIENT_FOUND_ROWSфункции C API при подключении к mysqld, значение affected-rows равно 1 (не 0), если существующая строка устанавливается в текущие значения. См. Раздел 13.2.5.2, «Оператор INSERT ... ON DUPLICATE KEY UPDATE». -
INSERT DELAYEDустарел в MySQL 5.6 и должен быть удален. В MySQL 5.7 модификаторDELAYEDпринимается, но игнорируется. ИспользуйтеINSERT(безDELAYED) вместо него. См. Раздел 13.2.5.3, «Оператор INSERT DELAYED».
Заявление INSERT, влияющее на разбиение таблицы с использованием механизма хранения, такого как MyISAM, который использует блокировки на уровне таблицы, блокирует только те разделы, в которые фактически вставляются строки. (Для механизмов хранения, таких как InnoDB, которые используют блокировку на уровне строк, блокировка разделов не происходит.) Дополнительную информацию см. в разделе 22.6.4, «Разбиение и блокировки».
© 2025 Oracle
Licensed under the GPLv2 License.