2012-04-25 2 views
2

В MySQL Я использовал оператор INSERT IGNORE для вставки строк в таблицу. Поскольку один столбец равен UNIQUE, некоторые строки не были вставлены (поскольку они уже были там). После выполнения этого утверждения я заметил, что в столбце автоматического увеличения есть некоторые недостающие числа между строками, которые позже я понял, что это произошло из-за строк, которые были проигнорированы и не добавлены.INSERT IGNORE увеличивает счетчик автоматического увеличения, даже запись не добавляется?

Можно ли установить систему, чтобы не увеличивать счетчик автоматического приращения, если ни одна строка не вставлена ​​с IGNORE оговоркой?

+0

Какой версия MySQL ты используешь? – eggyal

+1

Отсутствующие номера не являются проблемой в столбце auto_increment. Они никогда не гарантированно свободны от разрыва. Просто проигнорируйте это. –

+0

@eggyal - mysql Ver 14.14 Рассылка 5.5.20 для Linux (i686) с использованием readline 5.1 –

ответ

1

Цитируя manual page for INSERT:

If you use the IGNORE keyword, errors that occur while executing the INSERT statement are treated as warnings instead. For example, without IGNORE, a row that duplicates an existing UNIQUE index or PRIMARY KEY value in the table causes a duplicate-key error and the statement is aborted. With IGNORE, the row still is not inserted, but no error is issued.

Синтаксис INSERT IGNORE это просто способ подавить некоторые сообщения об ошибках, и это полезно, когда вы знаете, что эти ошибки могут произойти и/или хотите обработать их позже сцена. За кулисами у вас все еще есть регулярная вставка, за исключением того, что она не работает из-за нарушенного ключа. MySQL нуждается фактические значения строк, чтобы сделать вставку и счетчик AUTO_INCREMENT будет увеличиваться в соответствии с regular rules:

  1. Значение для столбца NULL.
  2. Значение для столбца не задано.
  3. Значение столбца больше, чем счетчик.

Так что, если вы не можете пересмотреть свою логику (например, тест, существует ли ключевые значения, прежде чем сделать вставку), единственным способом сброса счетчик ALTER TABLE:

ALTER TABLE t2 AUTO_INCREMENT = value; 
+0

Что было бы правильным утверждением для этого? Следующий оператор имеет синтаксическую ошибку: 'ALTER TABLE \' table \ AUTO_INCREMENT = (SELECT MAX (LAST_INSERT_ID (id)) FROM \ 'table \') '. Пожалуйста посоветуй. –

+0

Я полагаю, что 'ALTER TABLE' не ожидает подзапросов. Если переменная не выполняет трюк, вы всегда можете составить динамический SQL. Как бы то ни было, этот метод выглядит как последнее средство ИМХО. –

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