Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: сдвиг id при записи данных с одной таблицы в другую mysql
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » сдвиг id при записи данных с одной таблицы в другую mysql

Страниц (1): [1]
 

1. panchenko - 29 Июня, 2018 - 13:17:49 - перейти к сообщению
друзья такой вопрос - почему при копировании данных из одной таблицы в другую автоинкремент начинается не с последней записи?
к примеру есть table1 с 7288 записями и table2 пустая
делаю запрос
CODE (SQL):
скопировать код в буфер обмена
  1. INSERT INTO table2 (col1, col2) SELECT col1, col2 FROM table1;

в таблице table2 заносится 7288 записей и AUTO_INCREMENT=8192;
делаю ещё раз запрос
CODE (SQL):
скопировать код в буфер обмена
  1. INSERT INTO table2 (col1, col2) SELECT col1, col2 FROM table1;

в таблице table2 получается 15479 и автоинкремент AUTO_INCREMENT=16383;
смотрю что разница в айдишниках в середине таблицы, т.е. видно что вторая запись запись данных началась с огромным отступом записи...
хотя общее количество записей правильное 14576
Для уточнения хочу заметить, что само полу ID я не копирую, а только остальные простые поля.

Вот ссылка на скрин таблицы со сдвигом ID https://prnt[dot]sc/k0qrud

Подскажите пожалуйста почему такое происходит.
Заранее благодарен!
2. andrewkard - 29 Июня, 2018 - 14:49:41 - перейти к сообщению
Вы уверены что делаете запрос, а не делаете импорт таблицы, которую слили с помощью ПМА ?
3. panchenko - 01 Июля, 2018 - 16:25:01 - перейти к сообщению
Здравствуйте, да уверен, у меня есть таблица-1 и таблица-2... я просто делаю запрос на копирование данных их таблицы-1 в таблицу-2.
Приложу бэкап первой таблицы и бэкап второй, можете проделать тоже самое... если результат будет другой дайте знать.
Так же добавлю ссылку на 5-минут видео в котором показываю в чём проблема.
google-disk
https://drive[dot]google[dot]com/drive/f[dot][dot][dot]a4C8AWFbTA6UXG2h

Буду очень признателен, если кто-то сможет повторить данный эксперимент со своими таблицами данных, но только прошу что бы данных в таблице было не меньше чем 7000 строк, что бы не было потом вопросов...

Заранее благодарен)
4. andrewkard - 02 Июля, 2018 - 10:55:22 - перейти к сообщению
panchenko пишет:
Здравствуйте, да уверен, у меня есть таблица-1 и таблица-2... я просто делаю запрос на копирование данных их таблицы-1 в таблицу-2.

запрос в студию, пожалуйста
5. panchenko - 02 Июля, 2018 - 11:14:39 - перейти к сообщению
CODE (SQL):
скопировать код в буфер обмена
  1. INSERT INTO moex_test2 (`company_id`, `ticker`, `version`, `seqnum`, `open`, `high`, `low`, `last`, `close`, `volume`, `valtoday_rur`, `lasttoprevprice`, `lcloseprice`, `change`, `updatetime`, `time`, `systime`, `created_at`, `updated_at`) SELECT `company_id`, `ticker`, `version`, `seqnum`, `open`, `high`, `low`, `last`, `close`, `volume`, `valtoday_rur`, `lasttoprevprice`, `lcloseprice`, `change`, `updatetime`, `time`, `systime`, `created_at`, `updated_at` FROM moex_test


вот пожалуйста...
6. andrewkard - 02 Июля, 2018 - 16:47:12 - перейти к сообщению
В этом случае вряд ли бы повторилось то, что Вы описали. В moex_test2 id будет по порядку.
7. panchenko - 02 Июля, 2018 - 22:09:19 - перейти к сообщению
я кидал ссылку выше, но продублирую ещё раз...
https://drive[dot]google[dot]com/drive/f[dot][dot][dot]a4C8AWFbTA6UXG2h
здесь 6-минут видео, где я показываю всё пошагово... и получается сдвиг id
8. andrewkard - 03 Июля, 2018 - 10:07:50 - перейти к сообщению
Точно, пишут что это баг при innodb_autoinc_lock_mode = 1
https://bugs[dot]mysql[dot]com/bug.php?id=70692
Цитата:

but this is undocumented behaviour

https://www[dot]percona[dot]com/blog/201[dot][dot][dot]h-insert-ignore/
с другой стороны что это стандартное поведение
Цитата:

The default innodb_autoinc_lock_mode is "1". This means InnoDB only locks the auto-increment column on the table until the end of the INSERT statement if the number of rows to be inserted cannot be determined in advance (for example in an INSERT ... SELECT query). For a simple INSERT like your queries, it assigns the auto-increment ID in advance and then allows other inserts to the table immediately, for faster writing.


получается что в этом случае движку не удается корректно посчитать следующий инкремент и он выставляет его с запасом.
9. panchenko - 03 Июля, 2018 - 16:01:45 - перейти к сообщению
Понял, спасибо за разъяснение!

 

Powered by ExBB FM 1.0 RC1