Когда я попытался изменить таблицу, она показала ошибку:
ERROR 1067 (42000): Invalid default value for 'created_at'
Я искал эту ошибку в Google, но все, что я нашел, было так, как будто они пытались изменить метку времени, чтобы это произошло. Однако здесь я пытаюсь добавить новый столбец и получаю эту ошибку:
mysql> ALTER TABLE investments ADD bank TEXT;
ERROR 1067 (42000): Invalid default value for 'created_at'
а последние два столбца в моей таблице - created_at
и updated_at
.
Вот моя структура таблицы:
Ответы:
Проблема в 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';
источник
Просто, прежде чем запускать какие-либо операторы, поместите это в первую строку:
SET sql_mode = '';
источник
NO_ZERO_IN_DATE,NO_ZERO_DATE
позволяет нам поддерживать только другие функции безопасности:SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
Я столкнулся с той же ошибкой при попытке установить стороннюю базу данных. Я безуспешно пробовал предложенное решение, т.е.
SET sql_mode = '';
Затем я попробовал команду ниже, которая сработала, позволив установить базу данных.
SET GLOBAL sql_mode = '';
источник
SET sql_mode = '';
устарел,SET GLOBAL sql_mode = ''
все в порядкеПопробуйте выполнить следующую команду:
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 не принимает вашу команду, поскольку значения этих столбцов не могут быть нулевыми.Надеюсь это поможет.
источник
В моем случае у меня есть файл для импорта. Поэтому я просто добавил SET sql_mode = ''; в начале файла и все работает!
источник
Запустите этот запрос:
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; SET time_zone = "+00:00";
меня устраивает
источник
Сделать это можно так:
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;
см .: 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 []>
источник
У меня была аналогичная проблема. Следующее решил это:
Изменить:
recollect_date TIMESTAMP DEFAULT 'CURRENT_TIMESTAMP',
кому:
recollect_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
т.е. просто удалите кавычки вокруг CURRENT_TIMESTAMP .
Надеюсь, это кому-то поможет.
источник
Как упоминалось в ответе @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
и вставьте следующие строки.service mariadb stop
Выполнить обновление
yum update
Запуск MariaDB и выполнение обновления
service mariadb start
mysql_upgrade
Все сделано.
Проверьте версию MariaDB:
mysql -V
ПРИМЕЧАНИЕ . Всегда делайте резервную копию баз данных перед выполнением обновлений. Данные могут быть потеряны, если обновление не удалось или что-то пошло не так.
источник
SET GLOBAL sql_mode = '';
Решил мою проблему.
источник
Просто преобразуйте его в эту строку:
для новой таблицы:
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
источник
Для Mysql5.7 войдите в командную строку mysql и выполните команду,
mysql> show variables like 'sql_mode' ;
Он покажет, что NO_ZERO_IN_DATE, NO_ZERO_DATE в sql_mode.
Попробуйте добавить строку ниже [mysqld] в свой файл mysql conf, чтобы удалить два варианта, мой (mysql 5.7 в Ubuntu 16) - это /etc/mysql/mysql.conf.d/mysqld.cnf
Теперь перезапустите mysql. Оно работает!
источник
Для Mysql8.0.18:
Удаление "([fsp])", решило мою проблему.
источник
Сначала проверьте, что существующие режимы используют следующую команду в вашем терминале:
$ mysql -u root -p -e "SHOW VARIABLES LIKE 'sql_mode';"
или
mysql> show variables like 'sql_mode';
Вы увидите результат, как показано ниже
Отключить режим (ы) через my.cnf: в этом случае вам необходимо удалить режимы NO_ZERO_IN_DATE, NO_ZERO_DATE
Откройте файл my.cnf (обычно вы можете найти файл my.cnf, расположенный в /etc/my.cnf или /etc/mysql/my.cnf)
Режимы обновления в my.cnf под
[mysqld]
заголовкомsql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Здесь я пропустил режимы NO_ZERO_IN_DATE, NO_ZERO_DATE
Перезагрузите сервер mysql
$ /etc/init.d/mysql restart
источник