2013-09-23 8 views
2

имеют простую таблицу:Почему mysql insert ignore увеличивает поле автоинкремента?

id - key auto_increment int, 
mail - primary_key - varchar , 
type - primary_key - int, 

Have запрос как: вставить игнорировать в таблицу (идентификатор, почта, тип) ...

При добавлении записей, которые имеют ту же самую почту и введите этот показатель не добавлено, это нормально. Но в то же время поле id является автоматическим приращением, даже если запись не добавляется. Есть ли способ предотвратить это?

+0

Не могли бы вы помочь мне понять, почему 'ID' ** не ** ваш ПК и« почта, тип »- это Великобритания? – Kermit

+2

Это нормальное поведение. Значения auto_increment должны генерироваться в момент, когда вставка ATTEMPTED. Если вставка терпит неудачу, это новое значение auto_increment выбрасывается и никогда не используется повторно. –

+0

, так как я хочу, чтобы почта и тип были уникальными для таблицы, а не id. но мне по-прежнему это нужно по какой-то причине в таблице – abiku

ответ

4

Вы можете установить конфигурационную переменную innodb_autoinc_lock_mode=0, чтобы изменить способ, которым InnoDB отбрасывает идентификаторы, если сбой вставки.

См http://dev.mysql.com/doc/refman/5.6/en/innodb-auto-increment-configurable.html

  • innodb_autoinc_lock_mode = 0 («традиционный» режим блокировки)

    Этот режим блокировки обеспечивает такое же поведение, как и раньше существовали innodb_autoinc_lock_mode. Для всех инструкций типа «INSERT-like» создается специальная блокировка AUTO-INC на уровне таблицы и сохраняется в конце инструкции. Это гарантирует, что значения автоинкремента, назначенные любым заданным оператором, являются последовательными.

(курсив мой)

Обратите внимание, что этот режим блокировки также имеет эффект держит блокировку таблицы, пока ВСТАВИТЬ не завершится (либо успеха неудачи), и что может помешать пропускной способности, если у вас есть много параллельных потоков, вставляющих строки в одну и ту же таблицу.

Это не обязательно повлияет на ваше приложение, если у вас более умеренная скорость одновременных вставок.

Поэтому, чтобы ответить на ваш первоначальный вопрос, значение auto-inc увеличивается даже тогда, когда вставка не работает в поведении InnoDB по умолчанию, поскольку это позволяет MySQL быстрее освобождать таблицу-блокировку, то есть сразу после того, как она добавила auto-inc , но прежде, чем он попытается вставить. Но это означает, что если вставка терпит неудачу, какой-то другой поток может присвоить следующее значение auto-inc, поэтому ваш поток не сможет выделить его id.

Смежные вопросы