Как исправить "предупреждение: найдена строка, где столбец auto_increment имеет значение 0" в mysql? - PullRequest
2 голосов
/ 09 мая 2011

Я получаю это предупреждение, когда запускаю команду оптимизации базы данных mysql:

warning  : Found row where the auto_increment column has the value 0
status   : OK

Это предупреждение приходит к таблице пользователей, и я не уверен, не является ли это проблематичным для базы данных drupal. Mysql имеет это объяснение для предупреждения:

Это не ошибка сама по себе, но может вызвать проблемы, если вы решите сбросить таблицу и восстановить ее или сделать ALTER TABLE на столе. В этом регистр, столбец AUTO_INCREMENT меняет значение в соответствии с правилами столбцов AUTO_INCREMENT, которые могут вызвать проблемы, такие как двойной ключ ошибка.

Проблема, которая может иметь отношение к этому предупреждению, состоит в том, что всякий раз, когда я пытаюсь заблокировать пользователя, я получаю тайм-аут сервера, и запрос не действует. Я не знаю, какой запрос нужно выполнить, чтобы точно определить строки, в которых это происходит.

Ответы [ 3 ]

4 голосов
/ 09 мая 2011

Вы не можете ничего с этим поделать в Drupal 6. UID 0 и 1 имеют особое значение в Drupal и должны существовать таким образом, хотя MySQL это не нравится (по уважительным причинам).Из-за этих веских причин это было исправлено / изменено в Drupal 7. Некоторый фон ...

В Drupal 5 и более ранних версиях уровень базы данных не использовал AUTO INCREMENET из-за совместимости с другими базами данных.Все такие идентификаторы основаны на db_next_id(), который нужно было вызывать вручную перед вставкой новой строки.

В Drupal 6 был добавлен API-интерфейс Schema (Позволяет определять схему в массивах PHP, после чего Drupal будет создаватьспецифичные для базы данных запросы на создание таблицы и т. д.).db_next_id() был удален, и для нескольких таблиц (в основном пользователей и действий) были добавлены некоторые хакерские обходные пути.Это, однако, приводит к проблемам (например, невозможность легко экспортировать и импортировать таблицу, как MySQL сообщает в описании предупреждения).

В Drupal 7, db_next_id() был добавлен снова, явно для таблиц, где AUTO_INCREMENT(в Drupal Schema API называется 'serial') работает не очень хорошо.проект User Relationships , который я поддерживаю для Drupal 7, тоже делал что-то странное с таблицей auto_increment (повторное использование идентификаторов для соединения однонаправленных связей), которую я недавно заменил на db_next_id ().Так что, если вы поддерживаете пользовательский модуль или модуль Contributed, который взламывает AUTO INCREMENT, используйте взамен db_next_id () в Drupal 7!

2 голосов
/ 09 мая 2011

Drupal использует uid = 0 для анонимных пользователей, а фактические пользователи после этого получают автоматически увеличиваемые UID.Так что это ожидаемое поведение, и я не ожидаю, что оно будет связано с вашей ошибкой тайм-аута.Вы можете увеличить ограничение памяти PHP для этого.

0 голосов
/ 09 мая 2011

Это похоже на ошибку проектирования в Drupal, свяжитесь с авторами:)

Столбцы с автоинкрементом никогда не должны иметь значение 0, так как такое значение трудно вставить, поэтому выгрузка / восстановление может привести кне работает.

Они не должны использовать значение автоинкремента в таблице, для которой требуется строка с явным значением 0 для столбца auto-inc.В общем, вам вообще не следует полагаться на «магические идентификаторы» в столбцах auto-inc.

...