ERROR 1067 (42000): недопустимое значение по умолчанию для 'created_at'
Когда я попытался изменить таблицу, она показывает ошибку
ERROR 1067 (42000): Invalid default value for 'created_at'
i google для этой ошибки, но все, что я нашел, это если они пытались изменить временную метку, эта ошибка произошла, но здесь я пытаюсь добавить новый столбец, и я получаю эту ошибку.
mysql> ALTER TABLE investments ADD bank TEXT;
ERROR 1067 (42000): Invalid default value for 'created_at'
и моя таблица имеет последние два столбца created_at и updated_at
вот моя структура таблицы
![введите описание изображения здесь]()
Ответы
Ответ 1
Проблема из-за sql_modes. Пожалуйста, проверьте ваши текущие sql_modes командой:
show variables like 'sql_mode' ;
И удалите sql_mode " NO_ZERO_IN_DATE, NO_ZERO_DATE ", чтобы заставить его работать. Это sql_mode по умолчанию в новых версиях mysql.
Вы можете установить sql_mode глобально как root с помощью команды:
set global sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
Ответ 2
Просто перед запуском любых операторов поместите это в первую строку:
SET sql_mode = '';
Ответ 3
Попробуйте выполнить следующую команду:
ALTER TABLE `investments`
MODIFY created_at TIMESTAMP
DEFAULT CURRENT_TIMESTAMP
NOT NULL;
и
ALTER TABLE `investments`
MODIFY updated_at TIMESTAMP
DEFAULT CURRENT_TIMESTAMP
NOT NULL;
Причина, по которой вы получаете эту ошибку, заключается в том, что вы не устанавливаете значение по умолчанию для полей created_at
и updated_at
. MySQL не принимает вашу команду, поскольку значения для этих столбцов не могут быть нулевыми.
Надеюсь, что это поможет.
Ответ 4
Я столкнулся с той же ошибкой при попытке установить стороннюю базу данных.
Я попробовал решение, предложенное безуспешно, т.е.
SET sql_mode = '';
Затем я попробовал команду ниже, которая работала, позволяя устанавливать базу данных
SET GLOBAL sql_mode = '';
Ответ 5
В моем случае у меня есть файл для импорта.
Поэтому я просто добавил SET sql_mode = ''; в начале файла, и он работает!
Ответ 6
У меня была аналогичная проблема. После этого он решил:
Изменить:
recollect_date TIMESTAMP DEFAULT 'CURRENT_TIMESTAMP',
в
recollect_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
то есть. просто удалите кавычки вокруг CURRENT_TIMESTAMP.
Надеюсь, это поможет кому-то.
Ответ 7
Вы можете сделать это следующим образом:
CREATE TABLE `ttt` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`t1` TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00',
`t2` TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00',
`t3` TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00',
`t4` TIMESTAMP NULL DEFAULT 0,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
- Поскольку значение TIMESTAMP хранится как Epoch Seconds, значение временной метки '1970-01-01 00:00:00' (UTC) зарезервировано, так как второе # 0 используется для представления 0000-00-00 00: 00:00'.
- В MariaDB 5.5 и до этого может быть только один столбец TIMESTAMP для каждой таблицы, для которого значение CURRENT_TIMESTAMP определено как значение по умолчанию. Этот предел больше не применяется с MariaDB 10.0.
см. https://mariadb.com/kb/en/mariadb/timestamp/
Пример
MariaDB []> insert into ttt (id) VALUES (1),(2),(3);
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
MariaDB []> select * from ttt;
+----+---------------------+---------------------+---------------------+---------------------+
| id | t1 | t2 | t3 | t4 |
+----+---------------------+---------------------+---------------------+---------------------+
| 1 | 0000-00-00 00:00:00 | 2000-01-01 12:01:02 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 2 | 0000-00-00 00:00:00 | 2000-01-01 12:01:02 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
| 3 | 0000-00-00 00:00:00 | 2000-01-01 12:01:02 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
+----+---------------------+---------------------+---------------------+---------------------+
3 rows in set (0.00 sec)
MariaDB []>
Ответ 8
Запустите этот запрос:
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
он работает для меня
Ответ 9
Как уже упоминалось в ответе @Bernd Buffen. Это проблема с MariaDB 5.5, я просто обновляю MariaDB 5.5 до MariaDB 10.1 и проблема решена.
Вот шаги по обновлению MariaDB 5.5 до MariaDB 10.1 в CentOS 7 (64-разрядная версия)
-
Добавьте следующие строки в репозиторий MariaDB.
nano/etc/yum.repos.d/mariadb.repo
и вставьте следующие строки.
[MariaDB]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey = https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck = 1
- Остановите MariaDB, если уже запущен
service mariadb stop
-
Выполнить обновление
yum update
-
Запуск MariaDB и выполнение обновления
service mariadb start
mysql_upgrade
Все готово.
Проверьте версию MariaDB: mysql -V
ПРИМЕЧАНИЕ. Всегда выполняйте резервное копирование баз данных перед выполнением обновлений. Данные могут быть потеряны, если обновление не удалось или что-то пошло не так.
Ответ 10
Для Mysql5.7 войдите в командную строку mysql и выполните команду: mysql> show variable вроде "sql_mode"; Это покажет, что NO_ZERO_IN_DATE, NO_ZERO_DATE в sql_mode.
![enter image description here]()
Попытайтесь добавить строку ниже [mysqld] в вашем файле mysql conf, чтобы убрать две опции, моя (mysql 5.7 в Ubuntu 16) - это /etc/mysql/mysql.conf.d/mysqld.cnf
![enter image description here]()
Теперь перезапустите MySQL. Оно работает!
Ответ 11
SET GLOBAL sql_mode = '';
Решил мою проблему.
Ответ 12
Просто конвертируйте его в эту строку:
для новой таблицы:
CREATE TABLE t1 (
ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
для существующей таблицы:
Alter ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
Источник:
https://dev.mysql.com/doc/refman/5.5/en/timestamp-initialization.html