Перейти к основному содержанию

Drupal — ошибка при импорте базы

Drupal 10

Копировал базу из одного проекта в другой и столкнулся с ошибкой при импорте:

The website encountered an unexpected error. Try again later.
User error: Drupal\Core\Database\IntegrityConstraintViolationException thrown while calling __toString on a Drupal\Core\StringTranslation\TranslatableMarkup object in /public_html/core/modules/mysql/src/Driver/Database/mysql/ExceptionHandler.php on line 45: SQLSTATE[HY000]: General error: 1364 Field 'lid' doesn't have a default value: INSERT INTO "locales_source" ("source", "context", "version") VALUES (:db_insert_placeholder_0, :db_insert_placeholder_1, :db_insert_placeholder_2); Array ( [:db_insert_placeholder_0] => For this to work correctly, all tables must have a primary key. The following table(s) do not have a primary key: @tables. [:db_insert_placeholder_1] => [:db_insert_placeholder_2] => 10.2.0 ) in Drupal\Core\StringTranslation\TranslatableMarkup->__toString() (line 20 of core/lib/Drupal/Component/Utility/ToStringTrait.php).

На самом деле проблема не только в Drupal, она может проявиться в любой импортируемой базе. Просто ошибка тогда будет другая. "Field doesn't have a default value" говорит о том, что при вставке строки в таблицу значение по умолчанию не нашлось. Вставка не удалась.

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

  • Не использовать атрибут AUTO_INCREMENT для нулевых значений (Do not use AUTO_INCREMENT for zero values)
drupal

Поведение MySQL по умолчанию: если в столбец с AUTO_INCREMENT передать 0, система воспримет это как NULL и сгенерирует для него следующее доступное уникальное значение. Это может привести к конфликтам, особенно в таблицах, где 0 имеет специальное значение (например, в таблице users для анонимного пользователя с uid = 0).

Данная галка в PHPMyAdmin фактически включает SQL режим NO_AUTO_VALUE_ON_ZERO перед импортом дампа. Этот режим как раз разрешает вставку значения 0 в столбец с AUTO_INCREMENT, что и решает проблему совместимости с Drupal. 

Не забываем ставить эту галку при импорте данных.

Теги

 

Похожие материалы

MS SQL — удалить базу In Recovery

Разработчики 1С на тестовом сервере умудрились как-то сделать базу в статусе "In Recovery". Данная база не нужна, удалить её через GUI им не удалось. Detach - не сработал. Take offline - не сработал. Свойства БД тоже не удалось посмотреть. В таком случае, если база не нужна, проще сделать так:

Теги