Почему не удаётся пофиксить баг с внесением информации о вложении в базу данных при загрузке медиафайлов?

Ссылка скопирована
1 ответ

При загрузке медиафайлов стала появляться следующая ошибка:

Почему не удаётся пофиксить баг с внесением информации о вложении в базу данных при загрузке медиафайлов?

Смотрю `debug.log`:

[16-Nov-2023 14:04:07 UTC] WordPress database error Duplicate entry '0' for key 'veposts.PRIMARY' for query INSERT INTO `veposts` (`post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_content_filtered`, `post_title`, `post_excerpt`, `post_status`, `post_type`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_parent`, `menu_order`, `post_mime_type`, `guid`) VALUES (1, '2023-11-16 14:04:07', '2023-11-16 11:04:07', '', '', 'warrior', '', 'inherit', 'attachment', 'open', 'closed', '', 'warrior', '', '', '2023-11-16 14:04:07', '2023-11-16 11:04:07', 0, 0, 'image/jpeg', 'http://mysite.ru/wp-content/uploads/2023/11/warrior-3.jpg') made by wp_ajax_upload_attachment, media_handle_upload, wp_insert_attachment, wp_insert_post

[16-Nov-2023 14:04:07 UTC] WordPress database error Duplicate entry '0' for key 'veposts.PRIMARY' for query INSERT INTO `veposts` (`post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_content_filtered`, `post_title`, `post_excerpt`, `post_status`, `post_type`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_parent`, `menu_order`, `post_mime_type`, `guid`) VALUES (1, '2023-11-16 14:04:07', '2023-11-16 11:04:07', '', '', 'warrior', '', 'inherit', 'attachment', 'open', 'closed', '', 'warrior', '', '', '2023-11-16 14:04:07', '2023-11-16 11:04:07', 0, 0, 'image/jpeg', 'http://mysite.ru/wp-content/uploads/2023/11/warrior-3.jpg') made by wp_ajax_upload_attachment, media_handle_upload, wp_insert_attachment, wp_insert_post

Захожу в phpMyAdmin и вижу, что поле `ID` в таблице `vr_posts` не автоинкременируется. Ставлю галку в A_I, нажимаю Сохранить и выдаётся ошибка:

Ошибка запроса: #1062 - ALTER TABLE causes auto_increment resequencing, resulting in duplicate entry '1' for key 'veposts.PRIMARY'

Ошибка запроса: #1062 - ALTER TABLE causes auto_increment resequencing, resulting in duplicate entry '1' for key 'veposts.PRIMARY'

WTF?

P.S. 1) Вспоминаю, что сайт копировался на хостинг из локального OpenServer-а. 2) Так же обращаю внимание на то, что в конце ошибки указано: `made by wp_ajax_upload_attachment, media_handle_upload, wp_insert_attachment, wp_insert_post`.

Что это значит? Короче, что делать? Спасибо.

Дополнительно:

сайт копировался на хостинг из локального OpenServer-а.

Ну вот возможно и последствия неправильной миграции

  • Да всё правильно перенесено было. Конфиги были идентичны, а в дампе перед заливом на удаленный было изменено доменное имя
  • Ответы:

    Помогло?

    А это?
    For those arriving at this question because of the question title (as I did), this solved my problem:
    This error can indicate that the table's PRIMARY KEY is not set to AUTO-INCREMENT, (and your insert query did not specify an ID value).

    To resolve:
    Check that there is a PRIMARY KEY set on your table, and that the PRIMARY KEY is set to AUTO-INCREMENT.

    • Правильный ответ будет:

      This will happen if the table contains an existing record with an id of 0 (or negative). Updating all existing records to use positive values will allow auto_increment to be set on that column.

      Edit: Some people asked how that 0 got in there. For clarification, the MySQL Reference Manual states that "For numeric types, the default is 0, with the exception that for integer or floating-point types declared with the AUTO_INCREMENT attribute, the default is the next value in the sequence." So, if you performed an insert on a table without providing a value for the numeric column before the auto_increment was enabled, then the default 0 would be used during the insert. More details may be found at https://dev.mysql.com/doc/refman/5.0/en/data-type-....

      в ID=0 я изменил 0 на последнее число+1 в таблице и вуаля!

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Максим Павлов Ответ

    Ошибка Duplicate entry '0' for key 'PRIMARY' при загрузке медиа говорит о том, что WordPress пытается вставить новую запись attachment в таблицу posts, но поле ID почему-то получает значение 0 вместо автоинкремента. Это почти всегда проблема структуры таблицы, а не загрузчика файлов.

    Проверьте таблицу posts. У неё первичный ключ должен быть ID, и он обязан иметь AUTO_INCREMENT:

    SHOW CREATE TABLE veposts;

    SHOW CREATE TABLE veposts;

    Нормальный фрагмент должен быть примерно таким:

    ID BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (ID)

    ID bigint(20) unsigned NOT NULL AUTO_INCREMENT, PRIMARY KEY (ID)

    Если AUTO_INCREMENT пропал, восстановите его:

    ALTER TABLE veposts
      MODIFY ID BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT;

    ALTER TABLE veposts MODIFY ID bigint(20) unsigned NOT NULL AUTO_INCREMENT;

    После этого проверьте текущее максимальное значение ID:

    SELECT MAX(ID) FROM veposts;

    SELECT MAX(ID) FROM veposts;

    Если нужно, выставьте следующий auto_increment выше максимального:

    ALTER TABLE veposts AUTO_INCREMENT = 12345;

    ALTER TABLE veposts AUTO_INCREMENT = 12345;

    Подставьте число больше текущего MAX(ID). Перед ALTER обязательно сделайте дамп базы.

    Также убедитесь, что таблица действительно называется с вашим префиксом veposts, а не была повреждена при переносе/импорте. Такое бывает после некорректного экспорта из phpMyAdmin, ручной правки SQL, смены типа таблицы или восстановления из битого бэкапа.

    Когда структура исправлена, загрузка медиа снова начнёт создавать attachment-записи с нормальными ID, и ошибка уйдёт.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно