15.2.7.1 Оператор INSERT ... SELECT
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
[INTO] tbl_name
[PARTITION (partition_name [, partition_name] ...)]
[(col_name [, col_name] ...)]
{ SELECT ...
| TABLE table_name
| VALUES row_constructor_list
}
[ON DUPLICATE KEY UPDATE assignment_list]
value:
{expr | DEFAULT}
value_list:
value [, value] ...
row_constructor_list:
ROW(value_list)[, ROW(value_list)][, ...]
assignment:
col_name =
value
| [row_alias.]col_name
| [tbl_name.]col_name
| [row_alias.]col_alias
assignment_list:
assignment [, assignment] ...
С помощью оператора INSERT ...
SELECT вы можете быстро вставить множество строк в таблицу из результата оператора SELECT, который может выбирать из одной или нескольких таблиц. Например:
INSERT INTO tbl_temp2 (fld_id)
SELECT tbl_temp1.fld_order_id
FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;
Оператор TABLE можно использовать вместо оператора SELECT, как показано ниже:
INSERT INTO ta TABLE tb;
TABLE tb эквивалентно SELECT *
FROM tb. Это может быть полезно при вставке всех столбцов из исходной таблицы в целевую таблицу, и не требуется фильтрация с помощью WHERE. Кроме того, строки из TABLE можно упорядочить по одному или нескольким столбцам, используя ORDER BY, и ограничить количество вставляемых строк с помощью условия LIMIT. Дополнительную информацию см. в Разделе 15.2.16, «Оператор TABLE».
Следующие условия выполняются для операторов INSERT ...
SELECT, и, за исключением отмеченных случаев, также для INSERT ... TABLE:
Укажите
IGNORE, чтобы игнорировать строки, которые вызывают нарушения уникальности ключей.-
Целевая таблица оператора
INSERTможет появиться в условииFROMчасти оператораSELECTзапроса или как таблица, указанная операторомTABLE. Однако вы не можете вставить данные в таблицу и выбрать данные из той же таблицы в подзапросе.При выборе из таблицы и вставке данных в ту же таблицу MySQL создает внутреннюю временную таблицу для хранения строк из оператора
SELECT, а затем вставляет эти строки в целевую таблицу. Однако вы не можете использоватьINSERT INTO t ... SELECT ... FROM t, когдаtявляетсяTEMPORARYтаблицей, так как кTEMPORARYтаблицам нельзя обратиться дважды в одном операторе. По той же причине вы не можете использоватьINSERT INTO t ... TABLE t, когдаtявляется временной таблицей. См. Раздел 10.4.4, «Использование внутренних временных таблиц в MySQL», и Раздел B.3.6.2, «Проблемы с TEMPORARY таблицами». AUTO_INCREMENTстолбцы работают как обычно.Чтобы убедиться, что бинарный журнал можно использовать для повторного создания исходных таблиц, MySQL не разрешает одновременные вставки для операторов
INSERT ... SELECTилиINSERT ... TABLE(см. Раздел 10.11.3, «Одновременные вставки»).-
Чтобы избежать проблем с неоднозначными ссылками на столбцы, когда оператор
SELECTи операторINSERTссылаются на одну и ту же таблицу, предоставьте уникальное имя для каждой используемой таблицы в части оператораSELECTи используйте это имя для квалификации имён столбцов в этой части.Оператор
TABLEне поддерживает псевдонимы.
Вы можете явно выбрать, какие разделы или подразделы (или оба) исходной или целевой таблицы (или обеих) будут использоваться с помощью условия PARTITION, следующего за именем таблицы. Когда PARTITION используется с именем исходной таблицы в части оператора SELECT оператора, выбираются строки только из разделов или подразделов, указанных в списке разделов. Когда PARTITION используется с именем целевой таблицы для части оператора INSERT оператора, все выбранные строки должны быть вставляемы в разделы или подразделы, указанные в списке разделов. В противном случае, оператор INSERT ...
SELECT завершится неудачей. Более подробную информацию и примеры см. в Разделе 26.5, «Выбор разделов».
Оператор TABLE не поддерживает условие PARTITION.
Для операторов INSERT
... SELECT см. Раздел 15.2.7.2, «Оператор INSERT ... ON DUPLICATE KEY UPDATE» для условий, при которых столбцы оператора SELECT могут быть использованы в условии ON DUPLICATE KEY UPDATE. Это также работает для INSERT ... TABLE.
Порядок, в котором оператор SELECT или оператор TABLE без условия ORDER BY возвращает строки, не является детерминированным. Это означает, что при использовании репликации нет гарантии, что такой оператор SELECT возвращает строки в том же порядке на исходном и реплицированном серверах, что может привести к несоответствиям между ними. Чтобы предотвратить это, всегда используйте операторы INSERT ... SELECT или INSERT ... TABLE, которые должны быть реплицированы с помощью условия ORDER BY, которое обеспечивает одинаковый порядок строк на исходном и реплицированном сервере. См. также Раздел 19.5.1.18, «Репликация и LIMIT».
Из-за этой проблемы операторы INSERT ...
SELECT ON DUPLICATE KEY UPDATE и INSERT IGNORE ...
SELECT помечены как небезопасные для репликации на основе операторов. Такие операторы генерируют предупреждение в журнале ошибок при использовании режима репликации на основе операторов и записываются в бинарный журнал в формате на основе строк при использовании режима MIXED. (Ошибка #11758262, Ошибка #50439)
См. также Раздел 19.2.1.1, «Преимущества и недостатки репликации на основе операторов и на основе строк».
© 2025 Oracle
Licensed under the GPLv2 License.