2016-08-18 3 views
0

Я несколько вопросов относительно MySQL bluk вставки Игнорировать заявление, как для InnoDB и MyISAM.An Например:MySQL Массовая вставка Игнорировать

INSERT IGNORE INTO table(`reference`) VALUES ('1','2','3') 

Reference является уникальным ключом также.

  1. Является ли объемная вставка атомной? Итак, если я отправлю это в базу данных, могу ли я быть уверен, что между этим заявлением не возникает других вставок?

  2. Вставка партии возвращает значение первого идентификатора, вставленного в пакет. Однако, что произойдет, если первая вставка происходит дубликат (я получаю 0 в качестве возвращаемого значения или следующая (успешная вставка вернулась, я не мог найти это в документации)

Вида С уважением,

ответ

2

Многое здесь происходит ...

  • Синтаксическая ошибка: У вас есть 1 столбец, но 3 значения. Возможно, вы это имели в виду? ... VALUES (1), (2), (3).
  • После этого исправления ваш один оператор по существу эквивалентен трем 1-строчным INSERT IGNOREs, заключенным в транзакцию (при использовании InnoDB).
  • Из-за IGNORE любой дублирующий ключ не прерывает вставку.
  • VARIABLE innodb_autoinc_lock_mode контролирует то, что происходит с AUTO_INCREMENT во время многострочного INSERT. Необходимо знать его ценности, чтобы полностью ответить на этот вопрос. По умолчанию AUTO_INCREMENT id будет набито на 3, независимо от того, сколько значений reference являются дублирующими. Это приводит к неожиданному «жгуту» Ид. (И устраняет ваш вопрос о том, что такое «Первый идентификатор».)
  • Ничто не является «атомарным» в не транзакционном движке, таком как MyISAM. В частности, ...
  • С помощью MyISAM многострочная запись (вставка/обновление/удаление), которая прерывается (например, сбой питания), возможно, сделала некоторые из строк - вы не можете определить, сколько. (Это является важной причиной для предотвращения использования MyISAM.)
0

Один запрос MySQL, будь то SELECT, INSERT или что-нибудь еще, должно быть атомарным постольку, что заявление будет либо полностью удастся и закончить, или потерпеть неудачу и откат. Это не означает, что ваш INSERT будет работать в изоляции или что он будет полностью соответствовать требованиям ACID, но он должен быть атомарным.

A batch insert returns the value of the First ID inserted of the batch.

Я не знаю, какой инструмент или интерфейс вы используете, но documentation говорит иначе:

If you use an INSERT ... VALUES statement with multiple value lists or INSERT ... SELECT, the statement returns an information string in this format:

Records: 100 Duplicates: 0 Warnings: 0

В JDBC, например, API возвращает количество записей, затронутых INSERT операции, не идентификатор первой строки вставлен.