Поддержка Проблемы и решения Вопрос по работе автоинкремента ID в БД

  • Всем привет.
    Перенес на WP некоторые посты с другого движка.
    Пришлось перенести новые посты в БД с ID 5000, когда как изначально отсчет постов остановился на 2000, перенесенные посты отлично работают, новые пока добавляются дальше на 2000+. Вопрос, когда автоинкремент дойдет до 5000 он перескочит те посты или начнет затирать имеющиеся?

Просмотр 13 ответов — с 1 по 13 (всего 13)
  • Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Ответил в предыдущей теме, но теперь вижу, что ответ требует уточнения, т.к. мне пока не удалось воспроизвести ситуацию, когда значение AUTO_INCREMENT в таблице меньше одного из существующих ID.

    Автор rsl89

    (@rsl89)

    Извиняюсь не заметил.
    Тоже читал что промежуток не заполняется, однако у меня заполняется.
    Может быть это связано с тем что я напрямую меняю ид:

    
        $last_id = wp_insert_post($data);
        $new_id = $post_data['id'] + 500000;
        $last_id1 = $wpdb->query("UPDATE $wpdb->posts SET ID='$new_id' WHERE ID='$last_id'");
    
    Модератор Юрий

    (@yube)

    Может быть это связано с тем что я напрямую меняю ид:

    Конечно. Если не указывать id явно, то insert будет создавать новое значение, следующее после максимального. Если, конечно, не сломаны auto_increment и primary key.

    Автор rsl89

    (@rsl89)

    Юрий, подскажите, так как поведет себя auto_increment в будущем, учитывая что они не сломан? Будет затирать или продолжит?

    Модератор Юрий

    (@yube)

    В будущем — в смысле в штатном режиме? Должно увеличиваться на 1 после каждого insert. В PMA в «операциях» таблицы можно посмотреть (и изменить) текущее (следующее) значение AUTO_INCREMENT.

    Автор rsl89

    (@rsl89)

    Да в штатном режиме, когда AUTO_INCREMENT дойдет до добавленных постов с ранее увеличенным числом ID, он будет переписывать? Или перепрыгнет имеющиеся и дальше пойдет +1…

    Модератор Юрий

    (@yube)

    AUTO_INCREMENT (в смысле свойства таблицы) должен быть больше максимального значения автоинкрементного поля. Я вообще не уверен, что его можно сделать меньше без хирургического вмешательства (в смысле редактирования непосредственно файлов базы)

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    пока не удалось воспроизвести ситуацию, когда значение AUTO_INCREMENT в таблице меньше одного из существующих ID.

    Проверил ещё раз — при запросе типа

    
    UPDATE wp_posts SET ID = 10000 WHERE ID = 4500;
    

    значение AUTO_INCREMENT в таблице автоматически увеличивается до 10001, как и при вставке новой записи. При попытке изменить его обратно на 4501 ничего не меняется, остаётся на 10001.

    Так что у меня есть некоторые сомнения в том, что «новые пока добавляются дальше на 2000+», если, конечно, в базе что-то не сломано.

    А в чём вообще смысл этих манипуляций с ID? Может быть, задачу, ради которой понадобилось сохранять исходные ID с другого сайта, можно решить проще, если правильно её сформулировать?

    Выполнить проще никак не получалось.
    Я писал тут на форуме помочь тоже не смогли.
    Задача была перенести из БД ДЛЕ посты в WP.
    Но была проблема с ID категорий и постов, т.к они совпадали с имеющимися.
    Пришлось вручную увеличивать их ИД.
    Осложняло задачу и то что для моей темы создается 2 поста один как паблиш второй как на проверку админу пендинг.
    Кроме того при переносе постера пришлось воспользоваться кодом:

    
    $image_data = @file_get_contents($image);
        if ($image_data != false) {
            // получаем информацию о файле в структуру
            $info = pathinfo($image);
            // если нет расширения - уходим
            if (!isset($info['extension'])) {
                return "";
            }
            // создаем уникальное имя с расширением
            $filename = uniqid() . "." . $info['extension'];
            // получаем папку для загрузки, типа \wp-content\uploads\2020\10
            $upload_dir = wp_upload_dir();
            // создаем папку если ее нет и получаем имя файла
            if (wp_mkdir_p($upload_dir['path'])) {
                $file = $upload_dir['path'] . "/" . $filename;
            } else {
                $file = $upload_dir['basedir'] . "/" . $filename;
            }
            // пишем содержимое картинки в файл
            file_put_contents($file, $image_data);
            // получаем расширение и MIME тип файла
            $wp_filetype = wp_check_filetype($file, null);
            // создаем структуру для добавления аттача
            $attachment = array(
                'post_mime_type' => $wp_filetype['type'],
                'post_title' => sanitize_file_name($filename),
                'post_content' => '',
                'post_status' => 'inherit'
            );
            // добавляем аттач к посту $post_id
            $attach_id = wp_insert_attachment($attachment, $file, $new_id);
            // создаем промежуточные копии изображения и метаданные
            $attach_data = wp_generate_attachment_metadata($attach_id, $file);
            // обновляем метаданные аттача
            wp_update_attachment_metadata($attach_id, $attach_data);
            // добавляем картинку посту
            set_post_thumbnail($new_id, $attach_id);
        }
    

    что в свою очередь создает еще один пост с своим ИД.

    В общем сейчас простестил посты, у меня заполняет тот промежуток что остался между старыми и перенесенными постами, поэтому я и тревожусь чтобы не было затирания в будущем.
    Кроме того при переносе постов, новые посты присваивались с новым ИД, а вот публикация картинок и поста пендинг проходили как инкременты к старым постам. Было очень странно, такого функциоанала я скрипту не указывал.

    • Ответ изменён 2 недели, 6 дней назад пользователем rsl89.

    Я писал тут на форуме помочь тоже не смогли.
    Задача была перенести из БД ДЛЕ посты в WP

    Скорее это вы не воспользовались данными вам советами

    Все может быть.
    Может быть советы были неверно сформулированы.
    Но сделано то, что сделано.
    И вопрос топика остается открытым.

    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    В общем сейчас простестил посты, у меня заполняет тот промежуток что остался между старыми и перенесенными постами, поэтому я и тревожусь чтобы не было затирания в будущем.

    А какое сейчас значение AUTO_INCREMENT у таблицы? Можно посмотреть в phpMyAdmin на вкладке «Операции». Там же можно его увеличить до безопасного максимального значения, чтобы не беспокоиться о затирании.

    Текущее положение у меня 41261
    Последний перенесенный пост имеет ИД 512503

Просмотр 13 ответов — с 1 по 13 (всего 13)