getLastId

Тема в разделе "OpenCart", создана пользователем Den1a, 3 авг 2017.

  1. Den1a

    Den1a

    Регистрация:
    16 авг 2013
    Сообщения:
    55
    Симпатии:
    3
    Здравствуйте.

    Создаются категории и им присваиваются id по порядку. 1, 2, 3, 4, 5 и т.д.
    В какой-то момент категории стали получать 12500, 125001 и т.д.
    Не могу понять по какой причине id сразу перепрыгнул пару десятков значений.

    Встает вопрос что контролирует присвоение нового id категории.
    Есть функция getLastId. Она вызывается в контроллере, но где находится сам код функции?
    Какой запрос она посылает в БД, где сбит счетчик?
     
  2. chukcha

    chukcha

    Регистрация:
    9 окт 2014
    Сообщения:
    448
    Симпатии:
    119
    Возможно счтечик сбит каким-нибудь импортом
    Не надо его возвращать взад. Это нормальное поведение сервера бд

    getLastId - Это по сути это метод mysqli http://php.net/manual/ru/mysqli.insert-id.php
     
    Baco и Den1a нравится это.
  3. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    В базе.
    id генерируется через автоинкремент сразу в базе при вставке новых записей. Но его можно и вручную указать (просто это обычно нигде не делается). Если каким-то образом у вас был вставлен id со значением 12500, то все последующие стали получать номера начиная с этого числа.
    И как уже сказал chukcha, его не надо трогать, иначе у вас может потом получиться каша.
     
    Den1a нравится это.
  4. Den1a

    Den1a

    Регистрация:
    16 авг 2013
    Сообщения:
    55
    Симпатии:
    3
    Всем спасибо за ответы!
    Теперь разобрался. Для работы проекта важен id (синхронизация с 1с)
    Поправил вот так:
    Код:
    ALTER TABLE `oc_category` auto_increment = 1356;
     
  5. Dotrox

    Dotrox Команда форума

    Регистрация:
    27 ноя 2012
    Сообщения:
    3.198
    Симпатии:
    1.306
    А каким образом синхронизации мешают id выше 12500? У товаров, которые уже есть в базе и имеют меньшее значение id оно ведь не изменится.

    В любом случае, вам теперь надо тогда удалить все товары с id выше 12500, иначе когда счётчик дойдёт до этого числа у вас начнутся ошибки дублирующего основного ключа. Хотя я однозначно не уверен, как поведёт себя автоинкремент, если увидит, что число, которое он хотел использовать уже занято. Как минимум погуглите на этот счёт (или подождём Чукчу, я почти уверен, что он знает :Smile: ).
     
  6. chukcha

    chukcha

    Регистрация:
    9 окт 2014
    Сообщения:
    448
    Симпатии:
    119
    рекомендую провести эксперимент
    Код:
    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;
    
    И посмотреть содержимое базы

    Надеюсь больше вопросов не возникнет
     
  7. Den1a

    Den1a

    Регистрация:
    16 авг 2013
    Сообщения:
    55
    Симпатии:
    3
    [​IMG]

    Вот что вышло.
    Здесь все понятно.

    Я не создавал категории, когда увидел, что счетчик сбился. На данный момент счетчик подправлен и продолжается нормальная работа по обмену с 1С.
    Спасибо еще раз за подробную консультацию!
     
    Dotrox нравится это.
  8. chukcha

    chukcha

    Регистрация:
    9 окт 2014
    Сообщения:
    448
    Симпатии:
    119
    как видите изменение автоинремента не повлияло на работу, он продолжил с максимального
     
  9. iMateo

    iMateo

    Регистрация:
    23 фев 2013
    Сообщения:
    23
    Симпатии:
    2
    На моей памяти максимально заложенный системой ID может быть 6-ти значным. Не уверен, что был смысл мучаться с автоинкрементом.
     
  10. chukcha

    chukcha

    Регистрация:
    9 окт 2014
    Сообщения:
    448
    Симпатии:
    119
    int(11) под int отводится 4 байта 2^31 один бит под знак
    а это, на секундочку, макс значение - 2147483647 а если беззнаковое то еще на 2.