Spec-Zone .ru
спецификации, руководства, описания, API

13.2.5.1. INSERT ...SELECT Синтаксис

INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]    [INTO] tbl_name     [PARTITION (partition_name,...)]    [(col_name,...)]    SELECT ...    [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

С INSERT ... SELECT, можно быстро вставить много строк в таблицу от один или много таблиц. Например:

INSERT INTO tbl_temp2 (fld_id)  SELECT tbl_temp1.fld_order_id  FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;

Следующие условия содержат для a INSERT ... SELECT операторы:

Можно явно выбрать, какие разделы или подразделы (или оба) источника или предназначаются для таблицы (или оба) должны использоваться с a PARTITION опция после имени таблицы. Когда PARTITION используется с именем исходной таблицы в SELECT часть оператора, строки выбираются только из разделов или подразделов, названных в его списке раздела. Когда PARTITION используется с именем целевой таблицы для INSERT часть оператора, тогда должно быть возможно вставить все строки, выбранные в разделы или подразделы, названные в списке раздела после опции, еще INSERT ... SELECT сбои оператора. Для получения дополнительной информации и примеры, см. Раздел 17.5, "Выбор Раздела".

В части значений ON DUPLICATE KEY UPDATE, можно обратиться к столбцам в других таблицах, пока Вы не используете GROUP BY в SELECT часть. Один побочный эффект состоит в том, что следует квалифицировать групповые имена столбцов в части значений.

Порядок, в котором строки возвращаются a SELECT оператор без ORDER BY пункт не определяется. Это означает, что при использовании репликации нет никакой гарантии что такой SELECT строки возвратов в том же самом порядке на ведущее устройство и ведомое устройство; это может привести к несогласованностям между ними. Чтобы препятствовать тому, чтобы это произошло, следует всегда писать INSERT ... SELECT операторы, которые должны быть тиражированы как INSERT ... SELECT ... ORDER BY column. Выбор column не имеет значения, пока тот же самый порядок на возврат строк осуществляется и на ведущем устройстве и на ведомом устройстве. См. также Раздел 16.4.1.16, "Репликация и LIMIT".

Из-за этой проблемы, INSERT ... SELECT ON DUPLICATE KEY UPDATE и INSERT IGNORE ... SELECT операторы отмечаются как опасные для основанной на операторе репликации. С этим изменением такие операторы производят предупреждение в журнале при использовании основанного на операторе режима и регистрируются, используя основанный на строке формат при использовании MIXED режим. (Ошибка #11758262, Ошибка #50439)

См. также Раздел 16.1.2.1, "Преимущества и Недостатки Основанной на операторе и Построчной репликации".

В MySQL 5.7, INSERT ... SELECT оператор, который действовал на разделенные таблицы, используя механизм хранения такой как MyISAM это использует блокировки блокировок на уровне таблицы все разделы целевой таблицы; однако, только те разделы, которые фактически читаются из исходной таблицы, блокируются. (Это не происходит с таблицами, используя механизмы хранения такой как InnoDB та работа блокировка на уровне строки.) См. Раздел 17.6.4, "Деля и Блокируя", для получения дополнительной информации.