Здравствуйте. Создаются категории и им присваиваются id по порядку. 1, 2, 3, 4, 5 и т.д. В какой-то момент категории стали получать 12500, 125001 и т.д. Не могу понять по какой причине id сразу перепрыгнул пару десятков значений. Встает вопрос что контролирует присвоение нового id категории. Есть функция getLastId. Она вызывается в контроллере, но где находится сам код функции? Какой запрос она посылает в БД, где сбит счетчик?
Возможно счтечик сбит каким-нибудь импортом Не надо его возвращать взад. Это нормальное поведение сервера бд getLastId - Это по сути это метод mysqli http://php.net/manual/ru/mysqli.insert-id.php
В базе. id генерируется через автоинкремент сразу в базе при вставке новых записей. Но его можно и вручную указать (просто это обычно нигде не делается). Если каким-то образом у вас был вставлен id со значением 12500, то все последующие стали получать номера начиная с этого числа. И как уже сказал chukcha, его не надо трогать, иначе у вас может потом получиться каша.
Всем спасибо за ответы! Теперь разобрался. Для работы проекта важен id (синхронизация с 1с) Поправил вот так: Код: ALTER TABLE `oc_category` auto_increment = 1356;
А каким образом синхронизации мешают id выше 12500? У товаров, которые уже есть в базе и имеют меньшее значение id оно ведь не изменится. В любом случае, вам теперь надо тогда удалить все товары с id выше 12500, иначе когда счётчик дойдёт до этого числа у вас начнутся ошибки дублирующего основного ключа. Хотя я однозначно не уверен, как поведёт себя автоинкремент, если увидит, что число, которое он хотел использовать уже занято. Как минимум погуглите на этот счёт (или подождём Чукчу, я почти уверен, что он знает ).
рекомендую провести эксперимент Код: CREATE TABLE IF NOT EXISTS `t` ( `id` int(11) NOT NULL AUTO_INCREMENT, `val` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; INSERT INTO `t` (`id`, `val`) VALUES (1, 2), (2, 4); ALTER TABLE `t` auto_increment = 5; INSERT INTO `t` (`val`) VALUES (100), ( 101); ALTER TABLE `t` auto_increment = 3; INSERT INTO `t` (`val`) VALUES (103), ( 104); SHOW CREATE TABLE t; И посмотреть содержимое базы Надеюсь больше вопросов не возникнет
Вот что вышло. Здесь все понятно. Я не создавал категории, когда увидел, что счетчик сбился. На данный момент счетчик подправлен и продолжается нормальная работа по обмену с 1С. Спасибо еще раз за подробную консультацию!
На моей памяти максимально заложенный системой ID может быть 6-ти значным. Не уверен, что был смысл мучаться с автоинкрементом.
int(11) под int отводится 4 байта 2^31 один бит под знак а это, на секундочку, макс значение - 2147483647 а если беззнаковое то еще на 2.