ВСТАВКА MySQL. ОБНОВЛЕНИЕ ломает AUTO_INCREMENT? - PullRequest
0 голосов
/ 18 июня 2011

Существуют следующие две таблицы:

create table lol(id int auto_increment, data int, primary key id(id));
create table lol2(id int auto_increment, data int, primary key id(id));

Вставьте некоторые значения:

insert into lol2 (data) values (1),(2),(3),(4);

Теперь вставьте, используя select:

insert into lol (data) select data from lol2;

Сделайте это снова:

insert into lol (data) select data from lol2;

Теперь посмотрите на таблицу:

select * from lol;

Я получаю:

+----+------+
| id | data |
+----+------+
|  1 |    1 |
|  2 |    2 |
|  3 |    3 |
|  4 |    4 |
|  8 |    1 |
|  9 |    2 |
| 10 |    3 |
| 11 |    4 |
+----+------+

Я озадачен разрывом между 4 и 8 ...Что вызвало это и как я могу это сделать, чтобы не было разрыва?Большое спасибо!

1 Ответ

0 голосов
/ 18 июня 2011

auto_increment не гарантирует увеличения на 1 в столбце идентификатора.И не может, потому что, как только вы работаете с параллельными транзакциями, он все равно сломается:

BEGIN                                  BEGIN
  INSERT INTO lol VALUES(...)            INSERT INTO lol VALUES(..)   
  ...                                    ...
COMMIT                                 ROLLBACK

Какие идентификаторы должны быть назначены базой данных?Он не может заранее знать, какая транзакция будет успешной, а какая откатится.

Если вам нужна последовательная нумерация ваших записей, вы бы использовали запрос, который возвращает это;например,

SELECT COUNT(*) as position, lol.data FROM lol 
INNER JOIN lol2 ON lol.id < lol2.id 
GROUP BY lol.id
...