"#1067 - Invalid default value for 'post_date'" при попытке сброса AI после восстановления

18 апр. 2017 г., 17:10:25
Просмотры: 32.5K
Голосов: 7

Я восстановил базу данных WordPress из SQL-бэкапа. Однако после этого все таблицы потеряли автоинкремент.

Когда я пытаюсь добавить его обратно с помощью следующего SQL-запроса:

ALTER TABLE `mercury_posts` CHANGE `ID` `ID` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT;

Я получаю ошибку #1067 - Invalid default value for 'post_date'. Как это исправить?

1
Комментарии

Похоже, ваши таблицы были настроены на MyISAM вместо InnoDB

BenB BenB
29 апр. 2018 г. 04:49:27
Все ответы на вопрос 8
4
18

Значение по умолчанию для 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

1 сент. 2018 г. 11:55:40
Комментарии

Выше был добавлен некорректный 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';

popealope popealope
7 июл. 2020 г. 09:43:14

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

Carlos Faria Carlos Faria
10 июл. 2020 г. 19:24:29

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

STORM STORM
19 июн. 2023 г. 15:00:13

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

8ctopus 8ctopus
26 авг. 2024 г. 16:42:01
1
10

Необходимо добавить следующий код в начало вашего SQL-запроса:

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";
11 февр. 2020 г. 18:07:56
Комментарии

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; это решило проблему в моем случае

tmarois tmarois
7 мар. 2022 г. 22:26:32
2

Вы можете использовать следующую команду для изменения стандартного значения post_date:

  ALTER TABLE `wp_posts` 
  CHANGE `post_date` `post_date`  DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
17 авг. 2021 г. 19:04:23
Комментарии

Вот как WordPress должен создавать новые схемы.

Marcel Waldvogel Marcel Waldvogel
8 авг. 2022 г. 22:11:50

На самом деле, так вы только испортите свою базу данных, потому что WordPress определенно работает не так.

8ctopus 8ctopus
26 авг. 2024 г. 15:49:51
0

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

19 апр. 2017 г. 17:29:38
1

Первый запуск

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;

затем после автоинкремента

13 июл. 2023 г. 18:39:12
Комментарии

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

User User
13 июл. 2023 г. 21:27:55
0

Ответ Карлоса Фариа идеален!

Но вот небольшой код, который можно использовать, если вы работаете в 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 на новое значение автоинкремента, которое вам нужно)

17 авг. 2023 г. 12:18:41
0

Изменение sql_mode на

ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

работает, но сохраняется только до перезапуска sql-сервера.

Поэтому, если вам снова понадобится этот режим, вам придется снова изменять sql_mode.

22 мая 2021 г. 12:39:26
0
-1

это правильный ответ и решение вопроса: https://gist.github.com/kaorukobo/718f4eb684ac01e1b65fc4cb69587fae

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

29 мая 2024 г. 13:02:22