ERROR 1067 (42000): Invalid default value for / ERROR 1292 (22007): Incorrect datetime value
Признаки
- При импорте DDL в MySQL возникает следующая ошибка: "ERROR 1067 (42000): Invalid default value for 'column_name'".
- При импорте данных в MySQL возникает следующая ошибка: "ERROR 1292 (22007): Incorrect datetime value: '0000-00-00 00:00:00' for column 'column_name' at row 1".
Причины
Хотя по умолчанию нулевые даты в базе данных MySQL разрешены, это контролируется переменной sql_mode, которая может содержать или не содержать параметр NO_ZERO_DATE. Если параметр NO_ZERO_DATE добавлен, все значения TIMEASTAMP не допускают хранение нулевой даты. Проблема может возникнуть в двух случаях:
-
При создании таблицы, когда нулевая дата, например '0000-00-00 00:00:00', указана в выражении по умолчанию для столбца TIMESTAMP. Например:
mysql> select @@sql_mode; +-----------------------------------------------------------------------------+ | @@sql_mode | +-----------------------------------------------------------------------------+ | STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | +-----------------------------------------------------------------------------+ 1 row in set (0.00 sec)mysql> CREATE TABLE department -> ( -> id INT, -> name VARCHAR(100), -> creation_dt TIMESTAMP NOT NULL default '0000-00-00 00:00:00' -> ); ERROR 1067 (42000): Invalid default value for 'creation_dt' -
При загрузке данных, когда в столбец TIMESTAMP вставляется нулевая дата типа '0000-00-00 00:00:00' командой insert или load. Например:
mysql> select @@sql_mode; +-----------------------------------------------------------------------------+ | @@sql_mode | +-----------------------------------------------------------------------------+ | STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | +-----------------------------------------------------------------------------+ 1 row in set (0.00 sec)mysql> CREATE TABLE department -> ( -> id INT, -> name VARCHAR(100), -> creation_dt TIMESTAMP -> ); Query OK, 0 rows affected (0.09 sec)mysql> INSERT INTO department VALUES (1, 'DBA', '0000-00-00 00:00:00'); ERROR 1292 (22007): Incorrect datetime value: '0000-00-00 00:00:00' for column 'creation_dt' at row 1
Решения
Для решения этой проблемы вы можете рассмотреть возможность изменения переменной sql_mode в базе данных MySQL, исключив из неё параметр NO_ZERO_DATE. Чтобы проверить, содержится ли этот параметр в sql_mode, используйте следующий запрос:
SELECT @@sql_mode
Если присутствует режим NO_ZERO_DATE, удалите его из списка режимов, выполнив команду set с указанием всех режимов, кроме NO_ZERO_DATE, как показано в примере ниже.
Если результат запроса 'SELECT @@sql_mode' выглядит следующим образом:
mysql> select @@sql_mode;
+-----------------------------------------------------------------------------+
| @@sql_mode |
+-----------------------------------------------------------------------------+
| STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-----------------------------------------------------------------------------+
скопируйте этот результат в команду SET sql_mode, исключив NO_ZERO_DATE:
set sql_mode='STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
Теперь нулевые значения разрешены для столбцов TIMESTAMP в базе данных.
Если у вас есть другие вопросы, пожалуйста, свяжитесь с нами: support@convertum.ru