Spec-Zone .ru
спецификации, руководства, описания, API
|
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE] [INTO]tbl_name
[PARTITION (partition_name
,...)] [(col_name
,...)] SELECT ... [ ON DUPLICATE KEY UPDATEcol_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
операторы:
Определить IGNORE
проигнорировать строки, которые
вызвали бы двойные ключевые нарушения.
DELAYED
игнорируется с INSERT ... SELECT
.
Целевая таблица INSERT
оператор может появиться в FROM
пункт
SELECT
часть запроса. (Это не было возможно в некоторых более старых
версиях MySQL.) Однако, невозможно вставить в таблицу и выбрать из той же самой таблицы в подзапросе.
Выбирая из и вставляя в таблицу одновременно, MySQL создает временную таблицу, чтобы содержать
строки от SELECT
и затем вставляет те строки в целевую таблицу. Однако, это
остается истиной, которую невозможно использовать INSERT INTO t ... SELECT ...
FROM t
когда t
a TEMPORARY
таблица, потому что TEMPORARY
таблицы не могут быть упомянуты дважды в
том же самом операторе (см. Раздел C.5.7.2,"TEMPORARY
Табличные проблемы").
AUTO_INCREMENT
столбцы работают как обычно.
Чтобы гарантировать, что двоичный журнал может использоваться, чтобы воссоздать
исходные таблицы, MySQL не разрешает параллельные вставки для INSERT ... SELECT
операторы.
Избегать неоднозначных ссылочных проблем столбца когда SELECT
и 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, "Деля и Блокируя", для
получения дополнительной информации.