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 операторы:

Запускаясь с MySQL 5.6.2, можно явно выбрать, какие разделы или подразделы (или оба) источника или предназначаются для таблицы (или оба) должны использоваться с a PARTITION опция после имени таблицы. Когда PARTITION используется с именем исходной таблицы в SELECT часть оператора, строки выбираются только из разделов или подразделов, названных в его списке раздела. Когда PARTITION используется с именем целевой таблицы для INSERT часть оператора, тогда должно быть возможно вставить все строки, выбранные в разделы или подразделы, названные в списке раздела после опции, еще INSERT ... SELECT сбои оператора. Для получения дополнительной информации и примеры, см. Раздел 18.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".

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

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

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