Я хотел бы понять побочный эффект того, над чем я работал.Почему mysql auto_increment пропускает идентификаторы, когда я `INSERT INTO table() SELECT NULL FROM table`?
Я хотел создать большой (2+ миллиона) тестовой таблицы случайных чисел, так что я побежал следующее:
CREATE TABLE `block_tests` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `num` int(11)) ENGINE=InnoDB;
INSERT INTO `block_tests` (`num`) VALUES(ROUND(RAND() * 1E6));
-- every repeat of this line doubles number of rows;
INSERT INTO block_tests (num) SELECT ROUND(RAND() * 1E6) FROM block_tests;
INSERT INTO block_tests (num) SELECT ROUND(RAND() * 1E6) FROM block_tests;
INSERT INTO block_tests (num) SELECT ROUND(RAND() * 1E6) FROM block_tests;
-- etc
Размер таблицы правильно удваивается каждый итерации. Что странно, являются идентификаторами строк, которые были добавлены:
mysql> select * from block_tests limit 17;
+----+--------+
| id | num |
+----+--------+
| 1 | 814789 |
| 2 | 84489 |
| 3 | 978078 |
| 4 | 636924 |
| 6 | 250384 |
| 7 | 341151 |
| 8 | 954604 |
| 9 | 749565 |
| 13 | 884014 |
| 14 | 171375 |
| 15 | 204833 |
| 16 | 510040 |
| 17 | 935701 |
| 18 | 148383 |
| 19 | 934814 |
| 20 | 228923 |
| 28 | 340170 |
+----+--------+
17 rows in set (0.00 sec)
По какой-то причине, есть пропуски в ид. Существует схема с провалами:
4 skip to 6 - skip 1
9 skip to 13 - skip 4
20 skip to 28 - skip 8
43 skip to 59 - skip 16
Что происходит?
Почему вы делаете это таким образом? Почему бы просто не использовать 'INSERT INTO \' block_tests \ '(\' num \ ') VALUES (ROUND (RAND() * 1E6));' для всех из них? – Robbert
Вы имеете в виду, назовите 'INSERT INTO' 2 миллиона раз? Я мог бы также использовать хранимую процедуру с циклом. Я мог бы сделать несколько разных вещей - это не проблема. Мне это удалось, и теперь есть странный побочный эффект, который я хотел бы понять. – Kache