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

13.2.5. INSERT Синтаксис

13.2.5.1. INSERT ... SELECT Синтаксис
13.2.5.2. INSERT DELAYED Синтаксис
13.2.5.3. INSERT ... ONDUPLICATE KEY UPDATE Синтаксис
INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]    [INTO] tbl_name    [PARTITION (partition_name,...)]     [(col_name,...)]    {VALUES | VALUE} ({expr | DEFAULT},...),(...),...    [ ON DUPLICATE KEY UPDATE      col_name=expr        [, col_name=expr] ... ]

Или:

INSERT [LOW_PRIORITY | DELAYED | HIGH_PRIORITY] [IGNORE]    [INTO] tbl_name    [PARTITION (partition_name,...)]    SET col_name={expr | DEFAULT}, ...    [ ON DUPLICATE KEY UPDATE      col_name=expr        [, col_name=expr] ... ]

Или:

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

INSERT вставляет новые строки в существующую таблицу. INSERT ... VALUES и INSERT ... SET формы оператора вставляют строки, основанные на явно указанных значениях. INSERT ... SELECT форма вставляет строки, выбранные из другой таблицы или таблиц. INSERT ... SELECT обсуждается далее в Разделе 13.2.5.1,"INSERT ... SELECT Синтаксис".

В MySQL 5.6.2 и позже, вставляя в разделенную таблицу, можно управлять, какие разделы и подразделы принимают новые строки. PARTITION опция берет список разделенных запятой значений имен одного или более разделов или подразделов (или оба) таблицы. Если любая из строк, которые будут вставлены данным INSERT оператор не соответствует один из перечисленных разделов, INSERT оператор перестал работать с ошибкой, Найденной строкой, не соответствующей данный установленный раздел. См. Раздел 18.5, "Выбор Раздела", для получения дополнительной информации и примеры.

Можно использовать REPLACE вместо INSERT перезаписывать старые строки. REPLACE дубликат к INSERT IGNORE в обработке новых строк, которые содержат значения уникального ключа, которые копируют старые строки: новые строки используются, чтобы заменить старые строки вместо того, чтобы быть отброшенным. См. Раздел 13.2.8,"REPLACE Синтаксис".

tbl_name таблица, в которую должны быть вставлены строки. Столбцы, для которых оператор обеспечивает значения, могут быть определены следующим образом:

Значения столбцов могут быть даны несколькими способами:

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 в этом контексте. Ни один ничего не подразумевает о числе списков значений, и или может использоваться, есть ли единственный список значений или многократные списки.

Влиявшие строки оценивают за INSERT может быть получен, используя ROW_COUNT() функция (см. Раздел 12.14, "информационные Функции"), или mysql_affected_rows() C API-функция (см. Раздел 22.8.7.1,"mysql_affected_rows()" ).

Если Вы используете INSERT ... VALUES оператор с многократными списками значения или INSERT ... SELECT, оператор возвращает информационную строку в этом формате:

Records: 100 Duplicates: 0 Warnings: 0

Records указывает на число строк, обработанных оператором. (Это - не обязательно число строк, фактически вставленных потому что Duplicates может быть ненулевым.) Duplicates указывает на число строк, которые не могли быть вставлены, потому что они копируют некоторое существующее значение уникального индекса. Warnings указывает на число попыток вставить значения столбцов, которые были проблематичны в некотором роде. Предупреждения могут произойти при любом из следующих условий:

Если Вы используете API C, информационная строка может быть получена, вызывая mysql_info() функция. См. Раздел 22.8.7.35,"mysql_info()".

Если INSERT вставляет строку в таблицу, которая имеет AUTO_INCREMENT столбец, можно счесть значение используемым для того столбца при использовании SQL LAST_INSERT_ID() функция. Изнутри API C используйте mysql_insert_id() функция. Однако, следует отметить, что две функции не всегда ведут себя тождественно. Поведение INSERT операторы относительно AUTO_INCREMENT столбцы обсуждаются далее в Разделе 12.14, "информационные Функции", и Раздел 22.8.7.37,"mysql_insert_id()".

INSERT оператор поддерживает следующие модификаторы:

Вставка в таблицу требует INSERT полномочие для таблицы. Если ON DUPLICATE KEY UPDATE пункт используется, и двойной ключ вызывает UPDATE чтобы быть выполненным вместо этого, оператор требует UPDATE полномочие для столбцов, которые будут обновлены. Для столбцов, которые читаются, но не изменили Вас, нуждаются только SELECT полномочие (такой что касается столбца, на который ссылаются только на правой стороне col_name=expr присвоение в ON DUPLICATE KEY UPDATE пункт).

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