"#1067 - Invalid default value for 'post_date'" при попытке сброса AI после восстановления
Я восстановил базу данных WordPress из SQL-бэкапа. Однако после этого все таблицы потеряли автоинкремент.
Когда я пытаюсь добавить его обратно с помощью следующего SQL-запроса:
ALTER TABLE `mercury_posts` CHANGE `ID` `ID` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT;
Я получаю ошибку #1067 - Invalid default value for 'post_date'
. Как это исправить?

Значение по умолчанию для post_date — 0000-00-00 00:00:00. Если проверить переменную sql_mode следующим образом:
show variables like 'sql_mode';
... это покажет вам переменную sql_mode, которая будет выглядеть примерно так: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Вам нужно заново установить переменную sql_mode без параметров NO_ZERO_IN_DATE,NO_ZERO_DATE
Так, в предыдущем примере вы должны установить sql_mode следующим образом:
SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
Затем снова проверьте переменную sql_mode, чтобы убедиться, что она изменилась корректно:
show variables like 'sql_mode';
После этого ограничение будет снято ;D
Решение найдено здесь: https://stackoverflow.com/a/37696251/504910

Выше был добавлен некорректный AUTO_CREATE_USER. Правильный код был по указанной ссылке (https://stackoverflow.com/a/37696251/504910) set global sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

Написанный мной код не содержит NO_ZERO_IN_DATE,NO_ZERO_DATE. Исходная переменная sql_mode в моей системе имела NO_AUTO_CREATE_USER, поэтому я оставил её как есть.

Код, предоставленный @CarlosFaria, не работает для описанной проблемы. Однако код, предоставленный popealope
, работает корректно. Поэтому я предпочитаю исправить это в посте.

Смотрите мой ответ, где объясняется, почему это происходит https://wordpress.stackexchange.com/a/426561/157837

Первый запуск
ALTER TABLE `wp_posts`
CHANGE `post_date` `post_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
CHANGE `post_date_gmt` `post_date_gmt` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
CHANGE `post_modified` `post_modified` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
CHANGE `post_modified_gmt` `post_modified_gmt` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP;
затем после автоинкремента

Ответ Карлоса Фариа идеален!
Но вот небольшой код, который можно использовать, если вы работаете в PhpMyAdmin и не хотите возиться с настройками SQL.
Здесь я изменю значение sql_mode
, но только для текущей сессии, ровно на столько времени, сколько потребуется для изменения таблицы:
SET SESSION sql_mode=(SELECT REPLACE(@@sql_mode,'NO_ZERO_IN_DATE,NO_ZERO_DATE',''));
ALTER TABLE wp_posts auto_increment = XXX;
(Не забудьте изменить префикс таблицы wp_
и заменить XXX
на новое значение автоинкремента, которое вам нужно)

Изменение sql_mode на
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
работает, но сохраняется только до перезапуска sql-сервера.
Поэтому, если вам снова понадобится этот режим, вам придется снова изменять sql_mode.

это правильный ответ и решение вопроса: https://gist.github.com/kaorukobo/718f4eb684ac01e1b65fc4cb69587fae
кратко: вы не можете изменить таблицу, потому что mysql обнаруживает ошибку значения по умолчанию для поля post_date (и других полей тоже). поэтому просто адаптируйте запрос, чтобы решить эту проблему, после чего вы сможете изменить таблицу как захотите.
