Поведение MySQL AUTO_INCREMENT в многострочной вставке

Я думаю, что ответ на мой вопрос очевиден, но, поскольку я не смог найти никаких документов, подтверждающих это, я подумал, что стоит спросить. По крайней мере, для записи.

Как мы все знаем AUTO_INCREMENT поля увеличиваются каждый раз, когда INSERT заявление выполнено. И его значение может быть получено LAST_INSERT_ID() функция. В руководстве MySQL также упоминается , что с многорядными вставками, LAST_INSERT_ID() вернет первый идентификатор вставленных строк. Который я считаю хорошей идеей (действительно полезной).

Итак, вот мой вопрос:

Могу ли я предположить в INSERT IGNORE INTO оператор с несколькими строками, вставленные идентификаторы AUTO_INCREMENT поле всегда будет последовательным? Имейте в виду, что из-за IGNORE Модификатор и многопользовательская природа сервера MySQL, могут возникнуть разные сценарии.

Благодарю.

1 ответ

Решение

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

Однако, если ваши настройки не такие, то да. По крайней мере, в InnoDB вставки являются атомарными и ставятся в очередь при нацеливании на одну и ту же таблицу, поэтому идентификаторы из двух разных INSERT не будут чередоваться. (хотя это не задокументировано, поэтому полагаться на это... немного рискованно)


Как я проверял генерацию IGNORE INSERT ID:

mysql> CREATE TABLE  `ignoreinsert` (
    ->   `ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
    ->   `uq` int(10) unsigned NOT NULL,
    ->   PRIMARY KEY (`ID`),
    ->   UNIQUE KEY `uq` (`uq`)
    -> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.19 sec)

mysql> INSERT INTO ignoreinsert VALUES (null,1),(null,2);
Query OK, 2 rows affected (0.10 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM ignoreinsert;
+----+----+
| ID | uq |
+----+----+
|  1 |  1 |
|  2 |  2 |
+----+----+
2 rows in set (0.00 sec)

mysql> INSERT IGNORE INTO ignoreinsert VALUES (null,3),(null,1),(null,4),(null,2),(null,5);
Query OK, 3 rows affected (0.08 sec)
Records: 5  Duplicates: 2  Warnings: 0

mysql> SELECT * FROM ignoreinsert;
+----+----+
| ID | uq |
+----+----+
|  1 |  1 |
|  2 |  2 |
|  3 |  3 |
|  4 |  4 |
|  5 |  5 |
+----+----+
5 rows in set (0.00 sec)
Другие вопросы по тегам